Cod sursa(job #430615)
#include<cstdio>
int n,ori,lung,nec[1<<17],t[1<<17],str[1<<17],fin[1<<17];
void dfs(int i,int l)
{
if(l==nec[ori])
{
str[ori]=i;
return;
}
dfs(t[i],l+1);
}
void inte(int i)
{
if(nec[i]==0)
return;
lung++;
inte(str[i]);
}
int main()
{
freopen("cerere.in","r",stdin);
freopen("cerere.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&nec[i]);
for(int i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
t[y]=x;
}
for(int i=1;i<=n;i++)
{
ori=i;
dfs(i,0);
}
for(int i=1;i<=n;i++)
{
lung=0;
inte(i);
fin[i]=lung;
}
for(int i=1;i<=n;i++)
printf("%d ",fin[i]);
return 0;
}