Pagini recente » Cod sursa (job #320947) | Cod sursa (job #36597) | Cod sursa (job #1727786) | Cod sursa (job #1496015) | Cod sursa (job #299203)
Cod sursa(job #299203)
#include <stdio.h>
#define NM 100001
#define logNM 21
int n,logn;
int a[NM][logNM];
int k[NM];
int log[NM];
int t[NM];
int str[NM];
int calc(int);
int main()
{freopen("cerere.in","r",stdin);
freopen("cerere.out","w",stdout);
int i,j;
scanf("%d",&n);
int x,y;
for (i=1;i<=n;i++)
{scanf("%d",&k[i]);
}
for (i=1;i<n;i++)
{scanf("%d %d",&x,&y);
t[y]=x;
}
logn=0;
while ((1<<logn)<=n)
{logn++;
}
logn--;
for (i=1;i<=n;i++)
{a[i][0]=t[i];
}
for (j=1;j<=logn;j++)
for (i=1;i<=n;i++)
{a[i][j]=a[a[i][j-1]][j-1];
}
for (i=1;i<=n;i++)
{if (k[i]==0)
{str[i]=i;
continue;
}
str[i]=i;
while (k[i])
{x=0;
while ((1<<x)<=k[i])
{x++;
}
x--;
str[i]=a[str[i]][x];
k[i]-=(1<<x);
}
}
for (i=1;i<=n;i++)
{k[i]=-1;
}
for (i=1;i<=n;i++)
{if (k[i]==-1)
{k[i]=calc(i);
}
}
for (i=1;i<=n;i++)
printf("%d ",k[i]);
return 0;
}
int calc(int x)
{if (str[x]==x) return 0;
if (k[str[x]]==-1) calc(str[x]);
return k[str[x]]+1;
}