Pagini recente » Cod sursa (job #520383) | Cod sursa (job #3247834) | Cod sursa (job #3170398) | Cod sursa (job #1111847) | Cod sursa (job #1649309)
#include <iostream>
#include <cstdio>
#include <vector>
#include <bitset>
#include <stack>
#define nmax 250010
using namespace std;
int n,m1,np;
int dad[nmax];
int nrp[nmax];
int pater[nmax][20];
vector<int> m[nmax];
stack<int> s ;
void dfs()
{
s.push(0);
int nod;
while(!s.empty())
{
nod=s.top(); s.pop();
for(vector<int>::iterator it=m[nod].begin();it!=m[nod].end();it++)
{
nrp[*it]=nrp[nod]+1;
pater[*it][0]=dad[*it];
for(int i=1; ( 1<<(i-1) ) <=nrp[*it] ; i++)
pater[ *it ][ i ]=pater[ pater[ *it ][ i-1 ] ][ i-1 ];
s.push(*it);
}
}
}
int finds(int k,int nod)
{
int i;
if(k==1) return pater[nod][0];
for(i=0;(1<<i)<=k;i++); i--;
if( (1<<i) == k ) return pater[nod][i];
return finds( k-(1<<i),pater[nod][i] );
}
int main()
{
int nod,i,j,who,nr;
freopen("stramosi.in","r",stdin);
freopen("stramosi.out","w",stdout);
scanf("%d%d",&n,&m1);
for(i=1;i<=n;i++)
{
scanf("%d",&dad[i]);
m[ dad[i] ].push_back(i);
}
nrp[0]=-1;
dfs();
for(;m1;m1--)
{
scanf("%d%d",&who,&nr);
if( nr>nrp[who] ) printf("0\n");
else printf("%d\n",finds(nr,who));
}
fclose(stdin);
fclose(stdout);
return 0;
}