Pagini recente » Cod sursa (job #691079) | Cod sursa (job #1452) | Cod sursa (job #2071765) | Cod sursa (job #2240046) | Cod sursa (job #2142044)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in ("cerere.in");
ofstream out ("cerere.out");
int const nmax = 100000;
int const lgmax = 20;
int far[5 + lgmax][5 + nmax];
int query[5 + nmax];
int dp[5 + nmax];
int n;
void computefar(){
for(int h = 1 ; h <= lgmax ;h++){
for(int i = 1 ; i <= n ;i++){
int result = far[h - 1][i];
far[h][i] = far[h - 1][result];
}
}
}
int computedp(int node){
int dist = query[node];
int result = node;
for(int h = lgmax ; 0 <= h ; h--){
int jump = (1 << h);
if(jump <= dist){
dist -= jump;
result = far[h][result];
}
}
if(node == result)
dp[node] = 0;
else
dp[node] = dp[result] + 1;
return dp[node];
}
int main()
{
in>>n;
for(int i = 1 ; i <= n ;i++){
in>>query[i];
dp[i] = -1;
}
far[0][1] = 1;
for(int i = 1 ; i < n ;i++){
int a , b;
in>>a>>b;
far[0][b] = a;
}
computefar();
for(int i = 1 ; i <= n ;i++){
if(dp[i] == -1){
computedp(i);
}
out<<dp[i]<<" ";
}
return 0;
}