Pagini recente » Cod sursa (job #476507) | Cod sursa (job #1569384) | Cod sursa (job #451855) | Cod sursa (job #1501890) | Cod sursa (job #356870)
Cod sursa(job #356870)
#include <stdio.h>
#include <stdlib.h>
#define N 100005
int *a[N],b[N][18],f[N],T,ff[N];
int n;
void citire(){
int i,x,y;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&f[i]);
a[i]=(int*)malloc(4);a[i][0]=0;
}
for(i=1;i<n;i++){
scanf("%d%d",&x,&y);
b[y][0]=x;
ff[y]=1;
a[x][0]++;
a[x]=(int*)realloc(a[x],(a[x][0]+2)*4);
a[x][a[x][0]]=y;
}
for(i=1;i<=n;i++)
if(!ff[i]) {
T=i;
return;
}
}
void LCA(){
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=17;j++)
b[i][j]=-1;
b[T][0]=-1;
for(j=1;(1<<j)<=n;j++)
for(i=1;i<=n;i++)
if(b[i][j-1]!=-1)
b[i][j]=b[b[i][j-1]][j-1];
}
int fct(int i){
int c=0,x=f[i];
while(x){
//x/=2;
if(x%2) i=b[i][c];
x/=2;
c++;
}
return i;
}
void dfs(int x){
int i;
if(f[x])
//y=fct(x);
f[x]=1+f[fct(x)];
for(i=1;i<=a[x][0];i++)
dfs(a[x][i]);
}
void afisare(){
for(int i=1;i<=n;i++)
printf("%d ",f[i]);
}
int main(){
freopen("cerere.in","r",stdin);
freopen("cerere.out","w",stdout);
citire();
LCA();
dfs(T);
afisare();
return 0;
}