#include<stdio.h>
#define N 100005
int n,k[N],g[N];
int a[N][21];
int loga[21]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144};
int strm[N];
char c[700010];
void parsare()
{
int i,aux=0,cat=0;
fgets(c,700010,stdin);
for(i=0; c[i]!='\0'; i++)
{
if((c[i]>='0')&&(c[i]<='9'))
aux=aux*10+c[i]-'0';
else
{
k[++cat]=aux;
aux=0;
}
}
}
void citire()
{
int i,x,y,j;
scanf("%d\n",&n);
/*for(i=1; i<=n; i++)
scanf("%d",&k[i]);*/
parsare();
for(i=1; i<n; i++)
{
//scanf("%d%d",&x,&y);
fgets(c,700010,stdin);
x=y=0;
for(j=0; (c[j]>='0')&&(c[j]<='9'); j++)
x=x*10+c[j]-'0';
j++;
for(; (c[j]>='0')&&(c[j]<='9'); j++)
y=y*10+c[j]-'0';
a[y][0]=x;
a[y][20]=1;
}
}
void precalc()
{
int i,cat=-1;
bool ok=true;
while(ok)
{
cat++;
ok=false;
for(i=1; i<=n; i++)
{
if(a[i][20]>cat)
{
if(a[a[i][cat]][20]>cat)
{
ok=true;
a[i][cat+1]=a[a[i][cat]][cat];
a[i][20]++;
}
}
}
}
}
int caut(int x)
{
int p=0,u=18,m;
while(p<u)
{
m=(p+u)>>1;
if(x<=loga[m])
u=m;
else
p=m+1;
}
if(loga[p]>x)
p--;
return p;
}
int afla(int care)
{
int acu=k[care],str=care,aux;
while(acu)
{
aux=caut(acu);
str=a[str][aux];
acu-=loga[aux];
}
return str;
}
void rezolva(int care)
{
int cati=0;
while(k[care])
{
cati++;
care=strm[care];
}
printf("%d ",cati);
}
int main()
{
freopen("cerere.in","r",stdin);
freopen("cerere.out","w",stdout);
citire();
precalc();
int i;
for(i=1; i<=n; i++)
strm[i]=afla(i);
for(i=1; i<=n; i++)
rezolva(i);
printf("\n");
return 0;
}