Pagini recente » Cod sursa (job #2284850) | Cod sursa (job #239516) | Cod sursa (job #413732) | Cod sursa (job #1398534) | Cod sursa (job #2476169)
#include <iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int N=100005;
int str[18][N];
int k[N];
int log[N];
int tata[N];
vector<int> gr[N];
void prec(int n){
log[1]=0;
for(int i=2;i<=n+5;i++)
log[i]=log[i/2]+1;
for(int i=1;i<=n;i++)
str[0][i]=tata[i];
for(int len=0;len<17;len++){
for(int i=1;i<=n;i++){
str[len+1][i]=str[len][str[len][i]];
}
}
}
int dp[N];
int stramos(int nod,int k){
while(k>0){
int p=log[k];
nod=str[p][nod];
k-=(1<<p);
}
return nod;
}
void dfs(int nod,int tata){
if(k[nod]==0)
dp[nod]=0;
else{
int strm=stramos(nod,k[nod]);
dp[nod]=1+dp[strm];
}
for(auto x:gr[nod]){
if(x!=tata){
dfs(x,nod);
}
}
}
int main()
{
FILE*fin,*fout;
fin=fopen("cerere.in","r");
fout=fopen("cerere.out","w");
int n;
fscanf(fin,"%d",&n);
for(int i=1;i<=n;i++){
fscanf(fin,"%d",&k[i]);
}
for(int i=1;i<n;i++){
int x,y;
fscanf(fin,"%d%d",&x,&y);
tata[y]=x;
gr[x].push_back(y);
}
prec(n);
for(int i=1;i<=n;i++){
if(tata[i]==0){
dfs(i,0);
break;
}
}
for(int i=1;i<=n;i++){
fprintf(fout,"%d ",dp[i]);
}
return 0;
}