Cod sursa(job #57250)

Utilizator alextheroTandrau Alexandru alexthero Data 1 mai 2007 16:17:13
Problema Cerere Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.7 kb
#include <stdio.h>
#include <vector>

#define pb push_back
#define nmax 100005

using namespace std;

vector <int> e[nmax];
int k[nmax],n1,n2,i,n,nr[nmax],st[nmax];
char v[nmax];

void dfs(int x) {
	v[x] = 1;
	st[++st[0]] = x;
	if(k[x] != 0) nr[x] = 1 + nr[st[st[0] - k[x]]];
	for(int i = 0; i < (int)e[x].size(); i++) 
		if(!v[e[x][i]]) dfs(e[x][i]);
	st[0]--;
}

int main() {
	freopen("cerere.in","r",stdin);
	freopen("cerere.out","w",stdout);

	scanf("%d",&n);
	for(i = 1; i <= n; i++) scanf("%d",&k[i]);

	for(i = 1; i < n; i++) {
		scanf("%d%d",&n1,&n2);
		e[n1].pb(n2);
	}

	for(i = 1; i <= n; i++)
		if(k[i] == 0 && !v[i]) dfs(i);
	
	for(i = 1; i <= n; i++) printf("%d ",nr[i]); printf("\n");

	return 0;
}