#include <bits/stdc++.h>
#define N 100001
using namespace std;
ifstream f("cerere.in");
ofstream g("cerere.out");
int n,str[N],nr[N],p[N],br[N];
vector <int> a[N];
void dfs(int x, int lvl)
{
br[lvl]=x;
if(str[x])
nr[x]=nr[br[lvl-str[x]]]+1;
for(int j:a[x])
dfs(j,lvl+1);
}
int find_root(int x){
while(p[x])
x=p[x];
return x;
}
int main()
{
f>>n;
for(int i=1; i<=n; i++)
f>>str[i];
for(int i=1; i<=n-1; i++){
int x,y;
f>>x>>y;
a[x].push_back(y);
p[y]=x;
}
dfs(find_root(1),0);
for(int i=1; i<=n; i++)
g<<nr[i]<<" ";
return 0;
}