Cod sursa(job #331299)

Utilizator cotofanaCotofana Cristian cotofana Data 13 iulie 2009 16:31:41
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.79 kb
#include <cstdio>
#include <vector>
#define dim 100001

using namespace std;

int n, k[dim], p[dim], in[dim], rad, q[dim], sol[dim];
vector<int> g[dim];

void dfs(int node, int lvl) {
	vector<int>::iterator it;
	q[lvl]=node;
	
	if (k[node]) sol[node]=sol[q[lvl-k[node]]]+1;
	else sol[node]=0;
	
	for (it=g[node].begin(); it!=g[node].end(); ++it)
		dfs(*it, lvl+1);
}

int main() {
	int i, a, b;
	freopen("cerere.in", "r", stdin);
	freopen("cerere.out", "w", stdout);
	
	scanf("%d\n", &n);
	for (i=1; i<=n; ++i) scanf("%d ", &k[i]);
	for (i=1; i<n; ++i) {
		scanf("%d %d\n", &a, &b);
		g[a].push_back(b);
		p[b]=a;
		++in[b];
	}
	for (rad=1; rad<=n && in[rad]; ++rad) ;
	
	dfs(rad, 1);
	
	for (i=1; i<=n; ++i) printf("%d ", sol[i]);
	printf("\n");
	
	return 0;
}