Cod sursa(job #777151)

Utilizator tzipleatudTudor Tiplea tzipleatud Data 11 august 2012 11:02:16
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <fstream>
#include <cstdio>
#define N 250010
#define L 20

using namespace std;

FILE* fin=fopen("stramosi.in","r");
FILE* fout=fopen("stramosi.out","w");
const int maxb=8192;
char buf[maxb];
int ptr=0;

inline int GetInt()
{
    int nr=0;
    while(buf[ptr]<'0'||'9'<buf[ptr])
        if (++ptr>=maxb) fread(buf,maxb,1,fin),ptr=0;
    while ('0'<=buf[ptr]&&buf[ptr]<='9')
    {
        nr=nr*10+buf[ptr]-'0';
        if (++ptr>=maxb) fread(buf,maxb,1,fin),ptr=0;
    }
    return nr;
}

int n,i,j,m,p,q;
int D[L][N],Log[N],MP[N];
bool PW[N];

int Solve (int lvl, int nod)
{
    if (lvl==0) return nod;
    if (PW[lvl])
        return D[Log[lvl]][nod];

    return Solve(lvl-MP[lvl], D[Log[MP[lvl]]][nod]);
}

int main ()
{
    n=GetInt();m=GetInt();
    PW[0]=PW[1]=MP[1]=1;
    for (i=2;i<=n;i++)
    {
        Log[i]=Log[i/2]+1;
        MP[i]=MP[i-1];
        if (i%2==0)
            PW[i]=PW[i/2];
        if (PW[i]) MP[i]=MP[i/2]*2;
    }
    for (i=1;i<=n;i++)
        D[0][i]=GetInt();

    for (j=1;j<L;j++)
        for (i=1;i<=n;i++)
            D[j][i]=D[j-1][D[j-1][i]];

    for (i=1;i<=m;i++)
    {
        q=GetInt();p=GetInt();
        fprintf(fout,"%d\n",Solve(p,q));
    }
    fclose(fin);fclose(fout);
    return 0;
}