Cod sursa(job #311)

Utilizator gigi_becaliGigi Becali gigi_becali Data 10 decembrie 2006 10:06:12
Problema Cerere Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include <cstdio>
#include <string>
#include <deque>
#define MAXN 100001
using namespace std;
int n;
int x[MAXN], tata[MAXN];
bool next[MAXN];
int sol[MAXN];
void citire()
{
	freopen("cerere.in", "r", stdin);
	scanf("%d\n", &n);
	int i;
	for(i=1;i<=n;i++) scanf("%d ", &x[i]);
	for(i=1;i<n;i++)
	{
		int xx, yy;
		scanf("%d %d\n", &xx, &yy);
		tata[yy]=xx;
		next[xx]=1;
	}
}
void df(int p)
{
	deque<int>Q;
	int i=p, t, h;	
	h=x[p];
	Q.push_back(p);
	do
	{
        	h=x[i];
		for( t=0; t<h ;   t++,i=tata[i]);
		Q.push_back(i);
	}while(h);
	Q.pop_back();
	while(Q.size())
	{
		sol[Q[0]]=Q.size()-1;
		Q.pop_front();
	}
}
	 

void calcul()
{
	int i;
	memset(sol, -1, sizeof(sol));
	
	for(i=1;i<=n;i++)
		if(!next[i]) df(i);
	
	for(i=1;i<=n;i++)
		 if(sol[i]==-1) df(i);
}

int main()
{
	citire();
	calcul();
	freopen("cerere.out", "w", stdout);
	for(int i=1;i<=n;i++) printf("%d ", sol[i]);
	printf("\n");
	return 0;
}