Cod sursa(job #29550)

Utilizator marius135Dumitran Adrian Marius marius135 Data 9 martie 2007 15:48:28
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.85 kb
#include<stdio.h>

#define maxn 200001

long next[maxn*2];
long first[maxn],n;
long v[maxn*2];
long nr[maxn];
long sol[maxn];
long h[maxn];
long sel[maxn];

void df(long a,long b)
{
	h[b] = a;
	sel[a] = 1;
	if(nr[a] == 0 ) sol[a] = 0;
	else sol[a] = sol[h[b-nr[a]]]+1;
	
	long x = first[a];
	while(x)
		{
		if(sel[v[x]]==0) df(v[x],b+1);
		x = next[x];
		}
}

int main()
{
	long i,a,b;
	long long s;
	freopen("cerere.in","rt",stdin);
	freopen("cerere.out","w",stdout);
	
	scanf("%ld",&n);
	s= n*(n+1)/2;
	for(i=1;i<=n;i++)
		scanf("%ld",&nr[i]);
	
	for(i = 1; i <= n-1; i++)
		{
		scanf("%ld %ld",&a,&b);	
		v[i*2-1] = a;
		v[i*2] = b;
		next[i*2-1] = first[b];
		next[i*2] = first[a];
		first[b] = i*2-1;
		first[a] = i*2;
		s-=b;
		}	
	
	df(long(s),1);
	
	for(i=1;i<=n;i++) printf("%ld ",sol[i]);
	
	return 0;
}