Pagini recente » Cod sursa (job #1229389) | Cod sursa (job #3215621) | Cod sursa (job #3236856) | Cod sursa (job #3293237) | Cod sursa (job #3247898)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cerere.in");
ofstream fout("cerere.out");
const int nmax = 1e5+10;
const int LOG_MAX = 20;
int n;
vector<int> k_value(nmax,0),parent(nmax,0);
vector<vector<int>> up(LOG_MAX,vector<int> (nmax,0));
void read_input(){
fin >> n;
for(int i = 1; i <=n; i++){
fin >> k_value[i];
};
int nod_1,nod_2;
for(int i = 1; i <=n-1; i++){
fin >> nod_1 >> nod_2;
parent[nod_2] = nod_1;
}
};
void precalculare(){
for(int i = 1; i <=n; i++){
up[0][i] = parent[i];
};
for(int j = 1; j <LOG_MAX; j++){
for(int i = 1; i <=n; i++){
up[j][i] = up[j-1][up[j-1][i]];
}
}
}
int find_ancestor(int nod,int k){
for(int i = 0; i < LOG_MAX; i++){
if((1 << i)&k){
nod = up[i][nod];
}
};
return nod;
}
int solve(int nod){
int ans = 0;
for( ;k_value[nod];ans++,nod = find_ancestor(nod,k_value[nod]));
return ans;
}
int main(){
read_input();
precalculare();
for(int i = 1; i <=n; i++){
fout << solve(i) << " ";
}
return 0;
}