Pagini recente » Cod sursa (job #81766) | Cod sursa (job #2308536) | Cod sursa (job #1761301) | Cod sursa (job #1433148) | Cod sursa (job #2205616)
#include <fstream>
#define N 100001
int n, origin, v[N], k[N], start[N], item[N], next[N], count, current[N], c, r[N];
// a este tatal lui b
inline void add(int from, int to) {
++count;
item[count] = to;
next[count] = start[from];
start[from] = count;
}
inline void dfs(int x) {
++c;
current[c] = x;
if (k[x] == 0) r[x] = 0;
else r[x] = r[current[c - k[x]]] + 1;
int p = start[x];
while (p != 0) {
dfs(item[p]);
p = next[p];
}
--c;
}
int main() {
std::ifstream in("cerere.in");
std::ofstream out("cerere.out");
int i, x, y;
in >> n;
for (i = 1; i <= n; ++i) {
in >> k[i];
}
for (i = 1; i < n; ++i) {
in >> x >> y;
v[y] = 1;
add(x, y);
}
for (i = 1; i <= n; ++i) {
if (v[i] == 0) origin = i;
else v[i] = 0;
}
k[origin] = 0;
c = -1;
dfs(origin);
for (i = 1; i <= n; ++i) out << r[i] << ' ';
return 0;
}