Pagini recente » Cod sursa (job #2858282) | Cod sursa (job #978265) | Cod sursa (job #2493490) | Cod sursa (job #125759) | Cod sursa (job #676542)
Cod sursa(job #676542)
#include<fstream>
using namespace std;
int i,N,M,T[300005],R[300005],Sol[300005],viz[300005];
ifstream f("stramosi.in");
ofstream g("stramosi.out");
struct nod{int inf;nod* adr;}*A[300005];
struct intrebare{int nr,inf;intrebare* adr;}*Q[250005];
void citire(){
f>>N>>M;
int i,x,y;
for(i=1;i<=N;i++)
{f>>T[i];
if(T[i]!=0)
{nod*p=new nod;
p->inf=T[i];
p->adr=A[i];
A[i]=p;
p=new nod;
p->inf=i;
p->adr=A[T[i]];
A[T[i]]=p;}}
for(i=1;i<=M;i++)
{f>>y>>x;
intrebare*p=new intrebare;
p->nr=i;
p->inf=x;
p->adr=Q[y];
Q[y]=p;}}
void DFS(int I, int k){
viz[I]=1;
R[k]=I;
for(intrebare*q=Q[I];q;q=q->adr)
if(k-q->inf>0)
Sol[q->nr]=R[k-q->inf];
else Sol[q->nr]=0;
for(nod*p=A[I];p!=NULL;p=p->adr) if(viz[p->inf]==0) DFS(p->inf,k+1);
}
/*void afisare()
{for(int i=1;i<=N;i++){ for(intrebare*p=Q[i];p!=NULL;p=p->adr)
g<<p->inf<<" ";
g<<"\n";}}*/
int main (){
citire();
for(i=1;i<=N;i++)
if(T[i]==0)
DFS(i,1);
for(i=1;i<=M;i++)
g<<Sol[i]<<"\n";
return 0;}