Pagini recente » Cod sursa (job #1121025) | Cod sursa (job #2362620) | Cod sursa (job #604816) | Cod sursa (job #694730) | Cod sursa (job #2142048)
#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];
if(query[node] == 0)
dp[node] = 0;
else{
int result = node;
for(int h = lgmax ; 0 <= h ; h--){
int jump = (1 << h);
if(jump <= dist){
dist -= jump;
result = far[h][result];
}
}
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;
}
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;
}