Cod sursa(job #198142)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 8 iulie 2008 20:38:50
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <cstdio>
#include <vector>

#define IN "cerere.in"
#define OUT "cerere.out"
#define pb push_back
#define vv vector
#define N_MAX 100001
#define FOR(i,a,b) for(int i=a;i<=b;++i)

using namespace std;
vv < vv<int> > a(N_MAX);
vv <int> ks(N_MAX);
vv <bool> viz(N_MAX);
vv <bool> rad(N_MAX);
vv <int> stv(N_MAX);
vv <int> sol(N_MAX); 
int niv,N;


void scan()
{
	int x,y;
	freopen(IN, "r",stdin);
	freopen(OUT, "w",stdout);
	scanf("%d\n", &N);
	FOR(i,1,N)
		scanf("%d", &ks[i]);
	FOR(i,2,N)
		scanf("%d %d\n",&x,&y),
		a[x].pb(y),
		rad[y] = 1;
}

void df(int nod)
{
	viz[nod] = true; 
	stv[++niv] = nod;
	
	if(!ks[nod])	
		sol[nod] = 0;
	else
		sol[nod] = sol[ stv[niv - ks[nod]]] + 1; 
	
	int l=a[nod].size();
	for(int i=0;i<l;++i)
		if(!viz[ a[nod][i] ])
			df( a[nod][i] );
	--niv;	
}

void solve()
{
	int root;
	FOR(i,1,N)
		if(!rad[i])
		{	root = i;
			break; }
	df(root);
}

void print()
{
	FOR(i,1,N-1)
		printf("%d ",sol[i]);
	printf("%d\n",sol[N]);
}

int main()
{
	scan();
	solve();
	print();
	return 0;
}