#include <fstream>
#include <vector>
using namespace std;
ifstream cin("cerere.in");
ofstream cout("cerere.out");
int n,r,N;
int anc[19][100005];
vector<int> t;
vector<int> G,nxt,top,A,grad,dp;
int idx;
void add_edge(int x,int y)
{
idx++;
G[idx]=y;
nxt[idx]=top[x];
top[x]=idx;
}
void _dfs(int x,int tata)
{
anc[0][x]=tata;
for(int i=top[x];i;i=nxt[i])
{
int y=G[i];
if(y==tata)
continue;
_dfs(y,x);
}
}
void dfs(int x,int tata)
{
if(A[x]==0)
dp[x]=0;
else
dp[x]=1+dp[t[N-A[x]]];
for(int i=top[x];i;i=nxt[i])
{
int y=G[i];
if(y==tata)
continue;
t.push_back(x);
N++;
dfs(y,x);
N--;
t.pop_back();
}
}
int main()
{
cin>>n;
A=top=grad=dp=vector<int>(n+1);
G=nxt=vector<int>(2*n+1);
for(int i=1;i<=n;i++)
cin>>A[i];
for(int i=1;i<=n-1;i++)
{
int x,y;
cin>>x>>y;
add_edge(x,y);
grad[y]++;
}
for(int i=1;i<=n;i++)
if(!grad[i])
r=i;
_dfs(r,0);
dfs(r,0);
for(int i=1;i<=n;i++)
cout<<dp[i]<<" ";
return 0;
}