Pagini recente » Cod sursa (job #2762802) | Cod sursa (job #1512422) | Cod sursa (job #2951219) | Cod sursa (job #1498096) | Cod sursa (job #780607)
Cod sursa(job #780607)
#include<cstdio>
#include<vector>
const int maxx1=250005,maxx2=300005;
using namespace std;
int stiva[maxx1],n,m,i,a,b,nr,ans[maxx2],q[maxx2],tata[maxx1],copie[maxx1];
vector <int> quest[maxx1],x[maxx1];
void eval(int cnod)
{
for(int i=0;i<quest[cnod].size();i++)
if(q[quest[cnod][i]]>=nr)
ans[quest[cnod][i]]=0;
else
ans[quest[cnod][i]]=stiva[nr-q[quest[cnod][i]]];
}
void df(int nod)
{
stiva[++nr]=nod;
int i=0,t,cnod;
while(nr>0)
{
t=0;
for(;i<x[nod].size();i++)
if(tata[nod]!=x[nod][i])
{
stiva[++nr]=x[nod][i];
cnod=nod;
nod=x[nod][i];
copie[nr]=i+1;
i=x[nod].size()+5;
t=1;
}
if(t==0)
{
i=copie[nr];
eval(nod);
nr--;
nod=stiva[nr];
}
else
{
i=0;
eval(cnod);
}
}
}
int main()
{
freopen("stramosi.in","r",stdin);
freopen("stramosi.out","w",stdout);
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&tata[i]);
x[tata[i]].push_back(i);
x[i].push_back(tata[i]);
}
for(i=1;i<=m;i++)
{
scanf("%d %d",&a,&b);
quest[a].push_back(i);
q[i]=b;
}
for(i=1;i<=n;i++)
if(tata[i]==0)
df(i);
for(i=1;i<=m;i++)
printf("%d\n",ans[i]);
return 0;
}