Pagini recente » Cod sursa (job #2059880) | Cod sursa (job #1612147) | Cod sursa (job #205313) | Cod sursa (job #2396002) | Cod sursa (job #2476163)
#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;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){
int p=log[k];
if(k==(1<<p)){
return str[p][nod];
}
k-=(1<<p);
return stramos(str[p][nod],k);
}
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;
}