#include<fstream>
#include<cstdio>
#include<vector>
#include<iostream>
using namespace std;
ofstream g("cerere.out");
int str[100005], sol[100005], t[100005];
int n, rad;
vector <int> G[100005];
vector <int> Deq;
char Buffer[100000];
int Buffer_Size = 100000;
int Pos = 0;
void Citeste(int & Nr)
{
Nr = 0;
while(Buffer[Pos]<'0' || Buffer[Pos]>'9')
{
Pos++;
if(Pos == Buffer_Size)
{
fread(Buffer,1,Buffer_Size,stdin);
Pos = 0;
}
}
while(Buffer[Pos]>='0' && Buffer[Pos]<='9')
{
Nr = Nr * 10 + Buffer[Pos++] - '0';
if(Pos == Buffer_Size)
{
fread(Buffer,1,Buffer_Size,stdin);
Pos = 0;
}
}
}
void citire()
{
freopen("cerere.in","r",stdin);
int x, y;
//f>>n;
Citeste(n);
for(int i=1; i<=n; i++)
//f>>str[i];
Citeste(str[i]);
for(int i=1; i<n; i++){
//f>>x>>y;
Citeste(x); Citeste(y);
t[y] = 1;
G[x].push_back(y);
}
for(int i=1; i<=n; i++)
if(!t[i]){
rad = i;
break;
}
}
void DFS(int nod)
{
int i, vecin;
Deq.push_back(nod);
if(str[nod])
sol[nod] = sol[Deq[Deq.size() - 1 - str[nod]]] + 1;
for(i=0; i<(int)G[nod].size(); i++){
vecin = G[nod][i];
DFS(vecin);
}
Deq.pop_back();
}
void afisare()
{
for(int i = 1; i<=n; i++)
g<<sol[i]<<" ";
g<<"\n";
}
int main()
{
citire();
DFS(rad);
afisare();
return 0;
}