Cod sursa(job #198141)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 8 iulie 2008 20:34:54
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 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;
	int solutie=0,poz = niv;
		
	while(ks[ stv[poz] ])
		++solutie,
		poz -= ks[ stv[poz] ];
	sol[nod] = solutie;
	
	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;
}