Pagini recente » Cod sursa (job #1242731) | Cod sursa (job #2006770) | Cod sursa (job #1049946) | Cod sursa (job #1886779) | Cod sursa (job #486522)
Cod sursa(job #486522)
#include<stdio.h>
#include<vector>
#include<string.h>
using namespace std;
vector <int> v[250005];
int d[250005][21],p,lg;
int str[250005],n,m;
char s[56];
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,poz;
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);
scanf("\n");
for(i=1;i<=m;i++)
{
fgets(s,sizeof(s),stdin);
poz=0;q=l=0;
while(s[poz]>='0' && s[poz]<='9')
{
q=q*10+s[poz]-'0';
poz++;
}
poz++;
while(s[poz]>='0' && s[poz]<='9')
{
l=l*10+s[poz]-'0';
poz++;
}
for(p=0;(1<<p)<=l;p++);
if(str[q]<l)
printf("0\n");
else
printf("%d\n",parc(q,l));
}
return 0;
}