Pagini recente » Cod sursa (job #2505808) | Diferente pentru blog/finala-algoritmiada-2017 intre reviziile 3 si 2 | Diferente pentru blog/ccc-2017-bucharest intre reviziile 7 si 3 | Cod sursa (job #2191756) | Cod sursa (job #1792470)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
const int NMAX = 1e5 + 1;
int n, root, nr;
int k[NMAX], t[NMAX];
vector<int> v[NMAX];
int stk[NMAX], cnt, ans[NMAX];
void dfs(int node) {
stk[++cnt] = node;
if (k[node]) {
ans[node] = ans[stk[cnt - k[node]]] + 1;
}
else
ans[node] = 0;
for (const int& x: v[node]) {
dfs(x);
}
--cnt;
}
int main()
{
fin >> n;
for (int i = 1; i <= n; ++i)
fin >> k[i];
for (int i = 1, x, y; i < n; ++i) {
fin >> x >> y;
v[x].push_back(y);
t[y] = x;
}
for (int i = 1; i <= n; ++i)
if (t[i] == 0)
root = i;
dfs(root);
for (int i = 1; i <= n; ++i) {
fout << ans[i] << ' ';
}
return 0;
}