Pagini recente » Borderou de evaluare (job #2835488) | Borderou de evaluare (job #2835490) | Borderou de evaluare (job #2440945) | Borderou de evaluare (job #2440965) | Cod sursa (job #3365676)
#include <bits/stdc++.h>
using namespace std;
int lift[18][100005], ans[100005], pas[100005];
vector<int> adj[100005];
void dfs(int i){
int nod = i;
for(int b = 17; b >= 0; b--){
if(pas[i] & (1 << b)) nod = lift[b][nod];
}
if(pas[i])
ans[i] = ans[nod] + 1;
for(int j : adj[i])
dfs(j);
}
int main(){
ifstream cin("cerere.in");
ofstream cout("cerere.out");
int n;
cin >> n;
for(int i = 1; i <= n; i++){
cin >> pas[i];
}
int root = 0;
for(int i = 1; i < n; i++){
int u, v;
cin >> u >> v;
adj[u].push_back(v);
lift[0][v] = u;
}
for(int i = 1; i <= n; i++){
if(lift[0][i] == 0) root = i;
}
for(int b = 1; 1 << b < n; b++){
for(int i = 1; i <= n; i++){
lift[b][i] = lift[b - 1][lift[b - 1][i]];
}
}
dfs(root);
for(int i = 1; i <= n; i++) cout << ans[i] << ' ';
return 0;
}