Pagini recente » Borderou de evaluare (job #1119344) | Borderou de evaluare (job #2796664) | Borderou de evaluare (job #2130292) | Cod sursa (job #3365732) | Cod sursa (job #3365729)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5, LOG = 21;
int N;
int k[MAXN + 1];
vector <int> adj[MAXN + 1];
int jump[MAXN + 1][LOG + 1];
int dp[MAXN + 1];
void dfs(int u, int p) {
jump[u][0] = p;
for (int i = 1; i <= LOG; i++) {
jump[u][i] = jump[jump[p][i - 1]][i - 1];
}
for (auto v : adj[u]) {
dfs(v, u);
}
}
int kth(int u, int K) {
for (int i = LOG; i >= 0; i--) {
if (K & (1 << i)) {
u = jump[u][i];
}
}
return u;
}
void dfs2(int u, int p) {
if (!k[u]) {
dp[u] = 0;
}
else {
dp[u] = dp[kth(u, k[u])] + 1;
}
for (auto v : adj[u]) {
dfs2(v, u);
}
}
int main() {
ifstream fin("cerere.in");
ofstream fout("cerere.out");
fin >> N;
for (int i = 1; i <= N; i++) {
fin >> k[i];
}
for (int i = 1; i < N; i++) {
int u, v;
fin >> u >> v;
adj[u].push_back(v);
}
dfs(1, 0);
dfs2(1, 0);
for (int i = 1; i <= N; i++) {
fout << dp[i] << " ";
}
}