Cod sursa(job #285456)

Utilizator lolopolololopolo lolopolo Data 22 martie 2009 16:52:23
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include<fstream.h>
ifstream f("stramosi.in");
ofstream g("stramosi.out");
# define maxn 300000
long n,m,z[maxn],stiva[maxn],sol[maxn],vf;
int viz[maxn];
struct lista
{
	long inf;
	lista *urm;
}*a[maxn];
struct elem
{
	long inf,nr;
	elem *urm;
}*c[maxn];
void add(long x,long y)
{
	lista *q=new lista;
	q->inf=y;
	q->urm=a[x];
	a[x]=q;
}
void citire()
{
	long i,x,y;
	f>>n>>m;
	for(i=1;i<=n;i++)
	{
		f>>z[i];
		add(z[i],i);
	}
	for(i=1;i<=m;i++)
	{
		f>>x>>y;
		elem *q=new elem;
		q->inf=y;
		q->nr=i;
		q->urm=c[x];
		c[x]=q;
	}
f.close();
}
void solutie(long i,long vf)
{
	stiva[i]=vf;
	elem*q=c[vf];
	while(q)
	{
		if(i-q->inf>=0)
			sol[q->nr]=stiva[i-q->inf];
		else
			sol[q->nr]=0;
		q=q->urm;
	}
	lista *p=a[vf];
	viz[vf]=1;
	while(p)
	{
		if(viz[p->inf]==0)
			solutie(i+1,p->inf);
		p=p->urm;
	}
}

void afisare()
{
	long i;
	for(i=1;i<=m;i++)
		g<<sol[i]<<" ";
}

int main()
{
	long i;
	citire();
	for(i=1;i<=n;i++)
		if(z[i]==0)
			solutie(0,i);
	afisare();

f.close();
g.close();
return 0;
}