Pagini recente » Cod sursa (job #237655) | Cod sursa (job #145448) | Cod sursa (job #757812) | Cod sursa (job #949612) | Cod sursa (job #2777709)
#include <fstream>
#include <vector>
std::ifstream in("cerere.in");
std::ofstream out("cerere.out");
constexpr int N = 1e5 + 1;
std::vector<int> g[N];
int rg[N];
int v[N];
int dp[N];
int branch[N];
void dfs(int node, int level) {
branch[level] = node;
if (v[node]) {
dp[node] = dp[branch[level - v[node]]] + 1;
}
for (int x : g[node]) {
dfs(x, level + 1);
}
}
int find_root(int node) {
while (rg[node]) {
node = rg[node];
}
return node;
}
int main() {
int n;
in >> n;
for (int i = 1; i <= n; ++i) {
in >> v[i];
}
for (int i = 1; i < n; ++i) {
int a, b;
in >> a >> b;
g[a].push_back(b);
rg[b] = a;
}
dfs(find_root(1), 0);
for (int i = 1; i <= n; ++i) {
out << dp[i] << ' ';
}
out << '\n';
}