Pagini recente » Cod sursa (job #976283) | Cod sursa (job #733006) | Cod sursa (job #689500) | Cod sursa (job #1053017) | Cod sursa (job #612365)
Cod sursa(job #612365)
#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=18;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;
}