Cod sursa(job #670763)

Utilizator Tucu94Andrei Tuculanu Tucu94 Data 30 ianuarie 2012 08:15:25
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#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;
}