Cod sursa(job #622166)
#include <stdio.h>
#include <math.h>
#include <vector>
#define M 100010
using namespace std;
long n, a, b, i, S[M], ma[M], f[M], r, d[M];
vector < long > V[M];
void df(long nod) {
S[S[0]] = nod;
if (ma[nod] == 0) f[nod] = 0;
else f[nod] = f[S[S[0] - ma[nod]]] + 1;
for (long i = 0; i < V[nod].size(); ++i) {
++S[0];
df(V[nod][i]);
--S[0];
}
}
int main() {
freopen("cerere.in", "r", stdin);
freopen("cerere.out", "w", stdout);
scanf("%ld", &n);
for (i = 1; i <= n; ++i) scanf("%ld", &ma[i]);
for (i = 1; i < n; ++i) {
scanf("%ld %ld", &a, &b);
V[a].push_back(b);
++d[b];
}
for (i = 1; i <= n; ++i) {
if (ma[i] == 0 && ma[i] == d[i]) {
r = i;
break;
}
}
df(r);
for (i = 1; i <= n; ++i) {
printf("%ld ", f[i]);
}
return 0;
}