Cod sursa(job #259947)

Utilizator cameleonGeorgescu Dan cameleon Data 16 februarie 2009 10:00:08
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#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;
}