Cod sursa(job #733349)

Utilizator vunsdnavunsdna vunsdna Data 11 aprilie 2012 21:22:03
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <stdio.h>
#include <string.h>

#define logN 19
#define maxN 250005
#define maxbuff 262144

int dp[logN][maxN];
char buff[maxbuff];
bool notread=true;
int idx;

inline void read(int &val)
{
    val=0;

    if(notread==true)
    {
        notread=false;
        fread(buff,1,maxbuff,stdin);
        idx=0;
    }

    for(;'0'<=buff[idx]&&buff[idx]<='9';)
    {
        val*=10;
        val+=buff[idx]-'0';
        if(++idx==maxbuff)
        {
            idx=0;
            fread(buff,1,maxbuff,stdin);
        }
    }

    for(;'0'>buff[idx]||buff[idx]>'9';)
        if(++idx==maxbuff)
        {
            idx=0;
            fread(buff,1,maxbuff,stdin);
        }
}

int main()
{
    int M,N;

    memset(dp,0,sizeof(dp));

    freopen("stramosi.in","r",stdin);
    freopen("stramosi.out","w",stdout);

    read(N);
    read(M);
    for(int i=1;i<=N;++i) read(dp[0][i]);

    for(int i=1;i<logN;++i)
        for(int j=1;j<=N;++j)
            dp[i][j]=dp[i-1][dp[i-1][j]];

    int P,Q,b;
    for(int i=1;i<=M;++i)
    {
        read(Q);
        read(P);
        b=0;
        while(P)
        {
            if(P&1) Q=dp[b][Q];
            if(!Q) break;
            ++b;
            P>>=1;
        }

        printf("%d\n",Q);
    }

    return 0;
}