Pagini recente » Cod sursa (job #576848) | Cod sursa (job #2379633) | Cod sursa (job #2568997) | Cod sursa (job #1121090) | Cod sursa (job #2690482)
#include <bits/stdc++.h>
#define STOP fout.close(); exit(0);
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
///***********************
const int NMAX = 1e5 + 3;
int n, v[NMAX], ans[NMAX], atLvl[NMAX], root;
bitset<NMAX> hasDad;
vector<int> edges[NMAX];
void read() {
fin >> n;
for (int i = 1; i <= n; i++)
fin >> v[i];
for (int a, b, i = 1; i < n; i++) {
fin >> a >> b;
edges[a].push_back(b);
hasDad[b] = true;
}
}
void getRoot() {
for (int i = 1; i <= n; i++)
if (!hasDad[i]) {
root = i;
return;
}
}
void dfs(int node, int lvl) {
atLvl[lvl] = node;
if (v[node])
ans[node] = ans[atLvl[lvl - v[node]]] + 1;
for (int it : edges[node])
dfs(it, lvl + 1);
}
void display() {
for (int i = 1; i <= n; i++)
fout << ans[i] << ' ';
}
int main() {
read();
getRoot();
dfs(root, 1);
display();
STOP
}