Pagini recente » Cod sursa (job #2701001) | Cod sursa (job #947336) | Cod sursa (job #308579) | Cod sursa (job #1947407) | Cod sursa (job #478559)
Cod sursa(job #478559)
#include <stdio.h>
#include <vector>
#include <queue>
#define pb push_back
#define Nmax 100002
using namespace std;
vector< int > v[Nmax];
queue< int > Q;
int str[17][Nmax];
int K[Nmax],rez[Nmax],gr[Nmax];
int n,rad;
inline int stramos(int p, int x){
int q;
while( p>0 ){
for(q=0; (1<<q)<=p; ++q); --q;
p -= (1<<q);
x=str[q][x];
}
return x;
}
void parc(){
vector< int >:: iterator it;
int f;
Q.push(rad);
while( !Q.empty() ){
f=Q.front(); Q.pop();
if( K[f] )
rez[f]=rez[stramos(K[f],f)]+1;
for(it=v[f].begin(); it!=v[f].end(); ++it)
Q.push(*it);
}
}
int main(){
int i,j,x,y;
freopen("cerere.in","r",stdin);
freopen("cerere.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;++i)scanf("%d",&K[i]);
for(i=1;i<n;++i){
scanf("%d%d",&x,&y);
str[0][y]=x;
v[x].pb(y); gr[y]++;
}
for(i=1;i<=n;++i) if(!gr[i]){ rad=i; break;}
for(j=1;j<17;++j)
for(i=1;i<=n;++i)
str[j][i]=str[j-1][str[j-1][i]];
parc();
for(i=1;i<=n;++i) printf("%d ",rez[i]);
fclose(stdin); fclose(stdout);
return 0;
}