Pagini recente » Cod sursa (job #1557725) | prob_mate | Cod sursa (job #2297331) | Istoria paginii runda/ah7 | Cod sursa (job #486518)
Cod sursa(job #486518)
#include<stdio.h>
#include<vector>
using namespace std;
vector <int> v[250005];
int d[250005][21],p,lg;
int str[250005],n,m;
int parc(int q,int l)
{
if(!l)
return q;
while((1<<p)>l)
p--;
return parc(d[q][p],l-(1<<p));
}
void dfs(int nod)
{
int i;
str[nod]=lg;
for(i=1;(1<<i)<=lg;i++)
d[nod][i]=d[d[nod][i-1]][i-1];
int lim=v[nod].size();
lg++;
for(i=0;i<lim;i++)
dfs(v[nod][i]);
lg--;
}
int main ()
{
int i,q,l;
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);
for(i=1;i<=m;i++)
{
scanf("%d%d",&q,&l);
for(p=0;(1<<p)<=l;p++);
if(str[q]<l)
printf("0\n");
else
printf("%d\n",parc(q,l));
}
return 0;
}