Cod sursa(job #612366)

Utilizator crushackPopescu Silviu crushack Data 7 septembrie 2011 06:01:41
Problema Stramosi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include <stdio.h>
#include <vector>
#define NMax 250010
#define LNMax 19
using namespace std;

const char IN[]="stramosi.in",OUT[]="stramosi.out";

int N,M;
int P[NMax][LNMax];
bool visit[NMax];
vector<int> ad[NMax],v;

void dfs(int x)
{
    int i;
    visit[x]=true;

    for (i=1;P[P[x][i-1]][i-1];++i)
        P[x][i]=P[P[x][i-1]][i-1];

    for (i=0;i<(int)ad[x].size();++i) if (!visit[ad[x][i]])
        dfs(ad[x][i]);
}

int Query(int x,int y)
{
    int step;

    for (step=17;step>=0;--step)
        if ( y>=(1<<step) )
            x=P[x][step],y-=(1<<step);
    return x;
}

int main()
{
    int i,x,y;
    freopen(IN,"r",stdin);
    scanf("%d%d",&N,&M);
    for (i=1;i<=N;++i)
        scanf("%d",&x) , ad[x].push_back(i) , P[i][0]=x;
    dfs(0);

    freopen(OUT,"w",stdout);
    while (M--)
    {
        scanf("%d%d",&x,&y);
        printf("%d\n",Query(x,y));
    }
    fclose(stdout);
    fclose(stdin);
    return 0;
}