Pagini recente » Borderou de evaluare (job #3367315) | Borderou de evaluare (job #3367373) | Borderou de evaluare (job #3367318) | Cod sursa (job #3365701) | Cod sursa (job #3365699)
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
int st[maxn], dp[maxn], k[maxn], p[maxn], m;
vector<int> edges[maxn];
void dfs1(int nod) {
st[++m] = nod;
dp[nod] = st[m - k[nod]];
for (int u : edges[nod]) {
dfs1(u);
}
m--;
}
void dfs2(int nod) {
if (dp[nod] == nod) dp[nod] = 0;
else dp[nod] = dp[dp[nod]] + 1;
for (int u : edges[nod]) {
dfs2(u);
}
}
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> k[i];
}
for (int i = 1; i < n; i++) {
int u, v;
cin >> u >> v;
edges[u].push_back(v);
p[v] = u;
}
int root = 0;
for (int i = 1; i <= n; i++) if (!p[i]) root = i;
dfs1(root);
dfs2(root);
for (int i = 1; i <= n; i++) cout << dp[i] << ' ';
return 0;
}