Pagini recente » Cod sursa (job #2884412) | Cod sursa (job #1951682) | Cod sursa (job #138369) | Cod sursa (job #536893) | Cod sursa (job #1132811)
#include <cstdio>
#include <vector>
using namespace std;
const long N = 100005;
long n, k [N], t [N], ans [N], radacina, st [N];
vector <long> graph [N];
void read () {
long i, a, b;
scanf ("%ld", &n);
for (i = 1; i <= n; i ++) {
scanf ("%ld", &k [i]);
ans [i] = -1;
}
for (i = 1; i < n; i ++) {
scanf ("%ld%ld", &a, &b);
graph [a].push_back (b);
t [b] = a;
}
}
void dfs (long x, long level) {
vector <long> :: iterator it;
st [level] = x;
ans [x] = 1 + ans [st [level - k [x]]];
for (it = graph [x].begin (); it != graph [x].end (); ++ it)
dfs (*it, level + 1);
}
void get_root () {
long i;
for (i = 1; i <= n; i ++)
if (t [i] == 0) {
radacina = i;
break;
}
}
void solve () {
long i;
get_root ();
dfs (radacina, 0);
for (i = 1; i <= n; i ++)
printf ("%ld ", ans [i]);
printf ("\n");
}
int main () {
freopen ("cerere.in", "r", stdin);
freopen ("cerere.out", "w", stdout);
read ();
solve ();
return 0;
}