Pagini recente » Cod sursa (job #2562705) | Cod sursa (job #3188902) | Cod sursa (job #34380) | Cod sursa (job #300227) | Cod sursa (job #3180685)
#include <fstream>
#include <iostream>
#define N 100002
std::ifstream fin("cerere.in");
std::ofstream fout("cerere.out");
int Q[N], n, parent[N], dp[N][18], LogN, h[N];
void compute(){
for(int i = 1; i <= n; i++){
dp[i][0] = parent[i];
for(int k = 1; k < LogN; k++){
dp[i][k] = dp[dp[i][k - 1]][k - 1];
}
}
}
int findAnc(int node, int k){
for(int j = LogN - 1; j >= 0; j--){
if((1 << j) <= k){
node = dp[node][j];
k -= (1 << j);
}
}
return node;
}
int main(){
fin >> n;
while((1 << LogN) <= n){
LogN ++;
}
for(int i = 1; i <= n; i++){
fin >> Q[i];
}
int x, y;
for(int i = 1; i <= n - 1; i++){
fin >> x >> y;
parent[y] = x;
}
compute();
for(int i = 1; i <= n; i++){
if(Q[i] == 0){
h[i] = 0; continue;
}
int qval = Q[i], qi = i, cnt = 0;
while(qval != 0 ){
++cnt;
qi = findAnc(qi, qval);
qval = Q[qi];
}
h[i] = cnt;
}
for(int i = 1; i <= n; i++){
fout << h[i] << " ";
}
}