Pagini recente » Cod sursa (job #1220569) | Cod sursa (job #357424) | Cod sursa (job #353044) | Cod sursa (job #1772083) | Cod sursa (job #486513)
Cod sursa(job #486513)
#include<stdio.h>
#include<vector>
using namespace std;
vector <int> v[250005];
int d[250005][25];
int str[250005],n,m;
int parc(int q,int l,int p)
{
if(!l)
return q;
while((1<<p)>l)
p--;
return parc(d[q][p],l-(1<<p),p-1);
}
void dfs(int nod,int l)
{
int i;
str[nod]=l;
for(i=1;(1<<i)<=l;i++)
d[nod][i]=d[d[nod][i-1]][i-1];
int lim=v[nod].size();
for(i=0;i<lim;i++)
dfs(v[nod][i],l+1);
}
int main ()
{
int i,q,l,put;
freopen("stramosi.in","r",stdin);
freopen("stramosi.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&d[i][0]);
if(d[i][0])
v[d[i][0]].push_back(i);
}
for(i=1;i<=n;i++)
if(!d[i][0])
dfs(i,0);
for(i=1;i<=m;i++)
{
scanf("%d%d",&q,&l);
for(put=0;(1<<put)<=l;put++);
if(str[q]<l)
printf("0\n");
else
printf("%d\n",parc(q,l,put-1));
}
return 0;
}