Cod sursa(job #263395)

Utilizator Andrei_ScorpioAndreiana Andrei Daniel Andrei_Scorpio Data 20 februarie 2009 12:32:41
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include<stdio.h>
#define Nmax 250001
#define Mmax 300001
 long n,m,cer[Mmax],t[Nmax],viz[Nmax],vec[Nmax];
 struct cereri
 {
 long inf,nr;
 cereri *urm;
 }*c[Nmax];
 struct elem
 {
 long inf;
 elem *urm;
 }*a[Nmax];

void citire()
{
 cereri *p;
 elem *q;
 long i,ce,x;
 freopen("stramosi.in","r",stdin);
 scanf("%ld %ld",&n,&m);
 for(i=1;i<=n;i++)
 {
	scanf("%ld",&t[i]);
	if(t[i]!=0)
	{
		q=new elem;
		q->inf=i;
		q->urm=a[t[i]];
		a[t[i]]=q;
	}
 }
 for(i=1;i<=m;i++)
 {
	scanf("%ld %ld",&x,&ce);
	p=new cereri;
	p->inf=ce;
	p->nr=i;
	p->urm=c[x];
	c[x]=p;
 }
 fclose(stdin);
}

void parcurg(long x,long niv)
{
 elem *p;
 vec[niv]=x;
 viz[x]=1;
 cereri *q;
 for(q=c[x];q;q=q->urm)
 {
	if(q->inf>niv)
		cer[q->nr]=0;
	else
		cer[q->nr]=vec[niv-q->inf];
 }

 for(p=a[x];p;p=p->urm)
 {
	if(viz[p->inf]==0)
		{
		parcurg(p->inf,niv+1);
		}
 }

}

void afisare()
{
 freopen("stramosi.out","w",stdout);
 long i;
 for(i=1;i<=m;i++)
 {
	printf("%ld\n",cer[i]);
 }
 fclose(stdout);
}
int main()
{
long i;
citire();
for(i=1;i<=n;i++)
	if(t[i]==0)
		parcurg(i,0);
afisare();
return 0;
}