Pagini recente » Cod sursa (job #1655534) | Cod sursa (job #545663) | Cod sursa (job #570679) | Cod sursa (job #2226163) | Cod sursa (job #2197821)
#include <cstdio>
#include <vector>
using namespace std;
vector<int>G[100005];
int k[100005];
bool r[100005];
int ans[100005];
int st[100005];
void dfs(int node, int lvl) {
st[lvl] = node;
if (k[node] != 0)
ans[node] = 1 + ans[st[lvl - k[node]]];
for (auto it:G[node])
dfs(it, lvl + 1);
}
int main() {
freopen("cerere.in", "r", stdin);
freopen("cerere.out", "w", stdout);
int n;
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
scanf("%d", &k[i]);
for (int i = 1; i < n; ++i) {
int u, v;
scanf("%d%d", &u, &v);
G[u].push_back(v);
r[v] = 1;
}
int root = 0;
for (int i = 1; i <= n && !root; ++i)
if (!r[i])
root = i;
dfs(root, 1);
for (int i = 1; i <= n; ++i)
printf("%d ", ans[i]);
return 0;
}