Pagini recente » Cod sursa (job #1994245) | Cod sursa (job #2125161) | Cod sursa (job #1841253) | Cod sursa (job #1141287) | Cod sursa (job #1329075)
#include<cstdio>
#define MAX 250000
using namespace std;
int dist[MAX+1];
int t[MAX+1][19];
int n;
int pas;
void build(){
int i,j;
for(i=1;(1<<i)<=n;i++)
for(j=1;j<=n;j++)
t[j][i]=t[t[j][i-1]][i-1];
}
void init(){
int i,p;
for(i=1;i<=n;i++)
for(p=1;p<=18;p++) t[i][p]=-1;
}
int query(int ad,int x){
if (ad>dist[x]) return 0;
if (ad==0) return x;
while((1<<pas)>ad) pas--;
return query(ad-(1<<pas),t[x][pas]);
}
int parinte(int x){
if (dist[x]!=0) return dist[x];
if (t[x][0]==0) return 0;
dist[x]=parinte(t[x][0])+1;
return dist[x];
}
int main(){
freopen ("stramosi.in","r",stdin);
freopen ("stramosi.out","w",stdout);
int i,m,p,q;
scanf ("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf ("%d",&t[i][0]);
init();
for(i=1;i<=n;i++)
if (dist[i]==0) dist[i]=parinte(i);
build();
for(i=1;i<=m;i++){
scanf ("%d%d",&q,&p);
pas=18;
printf ("%d\n",query(p,q));
}
return 0;
}