Pagini recente » Cod sursa (job #1072568) | Cod sursa (job #508760) | Cod sursa (job #1536056) | Istoria paginii runda/oni2011-scdtry | Cod sursa (job #2016396)
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
#include <cassert>
#include <cstring>
#include <climits>
#include <queue>
using namespace std;
typedef long long LL;
#ifdef INFOARENA
#define ProblemName "cerere"
#endif
#define MCONCAT(A, B) A B
#ifdef ProblemName
#define InFile MCONCAT(ProblemName, ".in")
#define OuFile MCONCAT(ProblemName, ".out")
#else
#define InFile "fis.in"
#define OuFile "fis.out"
#endif
const int MAXN = 100010;
int ans[MAXN], K[MAXN], N;
vector<int> G[MAXN];
bool hasP[MAXN];
vector<int> v;
void DFS(int x, int lvl = 0) {
v.push_back(x);
ans[x] = (K[x] == 0) ? 0 : (ans[v[lvl - K[x]]] + 1);
for (const auto &it : G[x])
DFS(it, lvl + 1);
v.pop_back();
}
int main() {
assert(freopen(InFile, "r", stdin));
assert(freopen(OuFile, "w", stdout));
scanf("%d", &N);
for (int i = 0; i < N; ++i)
scanf("%d", &K[i]);
for (int i = 0; i < N - 1; ++i) {
int a, b;
scanf("%d%d", &a, &b);
--a, --b;
G[a].push_back(b);
hasP[b] = true;
}
int root = 0;
for (; hasP[root]; ++root);
DFS(root);
for (int i = 0; i < N; ++i)
printf("%d ", ans[i]);
putchar('\n');
return 0;
}