Cod sursa(job #622173)

Utilizator alex_mircescuAlex Mircescu alex_mircescu Data 17 octombrie 2011 16:23:54
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.84 kb
#include <stdio.h>
#include <math.h>
#include <vector>

using namespace std;

#define NMAX 100004
#define sz size()
#define pb push_back

vector <int> a[NMAX];

long k[NMAX], n, nr[NMAX], vf, rez[NMAX], g[NMAX];

void df(long x) {
	long i;
	nr[vf] = x;
	rez[x] = 1 + rez[ nr[vf - k[x]] ];
	if (!k[x]) {
		rez[x] = 0;
	}
	for (i = 0; i < a[x].sz; ++i) {
		++vf;
		df(a[x][i]);
		--vf;
	}
}

int main() {
	freopen("cerere.in", "rt", stdin);
	freopen("cerere.out", "wt", stdout);

	long i, x, y;
	scanf("%ld", &n);
	for (i = 1; i <= n; ++i) {
		scanf("%ld", k + i);
	}
	for (i = 1; i < n; ++i)	{
		scanf("%ld %ld", &x, &y);
		a[x].pb(y);
		++g[y];
	}
	
	long rad = 0;
	for (i = 1; i <= n; ++i) {
		if (k[i] == 0 && g[i] == 0) { 
			rad = i; 
			break;
		}
	}
	df(rad);

	for (long i = 1; i <= n; ++i) {
		printf("%ld ", rez[i]);
	}
	
	printf("\n");
	return 0;
}