Cod sursa(job #502341)

Utilizator marta_diannaFII Filimon Marta Diana marta_dianna Data 18 noiembrie 2010 22:26:42
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include<fstream>
#include<list>
#define NMAX 100003

using namespace std;

ifstream f("cerere.in");
ofstream g("cerere.out");

list<int> a[NMAX];
int st, n, ns, k[NMAX], t[NMAX], s[NMAX], pp[NMAX];

struct coada
{
	int nod, prec;
}c[NMAX];

void citeste()
{
	int i, x, y;
	f>>n;
	for (i=1; i<=n; ++i) f>>k[i];
	for (i=1; i<n; ++i)
	{
		f>>x>>y;
		t[y]=x;
		a[x].push_back(y);
	}
	for (i=1; i<=n; ++i)
		if (t[i]==0) {st=i; break;}
}

void dfs(int nod)
{
	list<int> :: iterator it;
	s[++ns]=nod;pp[nod]=s[ns-k[nod]];
	for (it=a[nod].begin(); it!=a[nod].end(); ++it)
		dfs(*it);
	--ns;
}

void solve()
{
	int i, j, val;
	
	for (i=1; i<=n; ++i)
	{
		j=pp[i];
		if (j==i) val=0;
		else 
		{
			val=1;
			while (k[j]!=0) 
				{
					j=pp[j];
					++val;
				}
		}
		g<<val<<" ";
	}
}
	
int main()
{
	citeste();
	dfs(st);
	solve();
	f.close();
	g.close();
	return 0;
}