Cod sursa(job #259947)
#include<conio.h>
#include<fstream.h>
#define fin "stramosi.in"
#define fout "stramosi.out"
#define nmax 250001
#define mmax 300001
ifstream f(fin);
ofstream g(fout);
int tata[nmax],viz[nmax],s[nmax],sol[mmax],n,m;
struct elem{
int nr;
int inf;
elem *urm;}*a[nmax],*c[mmax];
void read()
{
f>>n>>m;
int i,p,q;
for(i=1;i<=n;i++)
{
f>>tata[i];
elem *t=new elem;
t->inf=i;t->urm=a[tata[i]];
a[tata[i]]=t;
}
for(i=1;i<=m;i++)
{f>>q>>p;
elem *t=new elem;
t->inf=p;t->nr=i;
t->urm=c[q];
c[q]=t;
}
f.close();
}
void df( int x, int niv)
{
viz[x]=1;
s[niv]=x;
elem *p;
for(p=c[x];p;p=p->urm)
if(niv-p->inf>0)
sol[p->nr]=s[niv-p->inf];
else
sol[p->nr]=0;
int i;
for(p=a[x];p;p=p->urm)
if(!viz[p->inf])df(p->inf,niv+1);
}
void write()
{
for(int i=1;i<=m;i++)
g<<sol[i]<<'\n';
g.close();
}
int main()
{
clrscr();
read();
for(int i=1;i<=n;i++)
if(!tata[i])df(i,1);
write();
return 0;
}