Pagini recente » Cod sursa (job #858354) | Cod sursa (job #1561) | Cod sursa (job #1305819) | Cod sursa (job #285112) | Cod sursa (job #596014)
Cod sursa(job #596014)
#include <stdio.h>
#define MAX_N 100010
int n;
int K[MAX_N], tata[20][MAX_N], ans[MAX_N];
inline int ancestor(int x, int nod) {
for (int i = 17; i >= 0; i--)
if ((1 << i) <= x) {
nod = tata[i][nod];
x -= 1 << i;
}
return nod;
}
void get_ans(int nod) {
if (ans[nod] != 0 || K[nod] == 0)
return;
get_ans(ancestor(K[nod], nod));
ans[nod] = 1 + ans[ancestor(K[nod], nod)];
}
void solve() {
for (int i = 1; i < 20; i++)
for (int j = 1; j <= n; j++)
tata[i][j] = tata[i - 1][tata[i - 1][j]];
for (int i = 1; i <= n; i++) {
get_ans(i);
printf("%d ", ans[i]);
}
printf("\n");
}
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 x, y;
scanf("%d %d", &x, &y);
tata[0][y] = x;
}
solve();
return 0;
}