Cod sursa(job #1003328)

Utilizator beldeabogdanBogdan Beldea beldeabogdan Data 30 septembrie 2013 13:59:33
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.76 kb
#include <cstdio>
#include <vector>
using namespace std;

int res[100005];
vector <int> v[100005];
int n;
int stk[100005],stp;
int k[100005];
int t[100005];

void dfs(int n) {
	stk[stp] = n;
	if (k[n] == 0) res[n] = 0;
	else res[n] = res[stk[stp-k[n]]] +1;
	stp++;
	while (!v[n].empty()) {
		int nod = v[n].back(); v[n].pop_back();
		dfs(nod);
	}
	stp--;
}

int main() {
	freopen("cerere.in","r",stdin);
	freopen("cerere.out","w",stdout);
	scanf("%d",&n);
	for (int i=1;i<=n;i++) scanf("%d",&k[i]);
	for (int i=1;i<n;i++) {
		int a,b;
		scanf("%d %d",&a,&b);
		v[a].push_back(b);
		t[b] = a;
	}
	int nod1;
	for (int i=1;i<=n;i++) if (t[i] == 0) {nod1 = i;break;}
	dfs(nod1);
	for (int i=1;i<=n;i++) printf("%d ",res[i]);
	return 0;
}