#include <bits/stdc++.h>
using namespace std;
ifstream f("cerere.in");
ofstream g("cerere.out");
int rezultat[100001];
vector<int>stiva;
int are_tata[100001];
vector<int> fii[100005];
int v[100001];
vector<int>q;
int radacina;
void dfs(int nod)
{
if(nod != radacina and v[nod] > 0)
{
int point_stramos = q.size() - v[nod];
int stramos = q[point_stramos];
rezultat[nod] = 1 + rezultat[stramos];
}
else
rezultat[nod] = 0;
q.push_back(nod);
for(int i = 0; i < fii[nod].size(); i++)
{
int fiu = fii[nod][i];
dfs(fiu);
}
q.pop_back();
}
int main()
{
int n,i,x,y;
f >> n;
for(i = 1; i <= n; i++)
{
f >> v[i];
}
for(i = 1; i < n; i++)
{
f >> x >> y;
fii[x].push_back(y);
are_tata[y] = 1;
}
for(i = 1; i <= n; i++)
{
if(are_tata[i] == 0)
radacina = i;
}
dfs(radacina);
for(i = 1; i <= n; i++)
{
g << rezultat[i] << " ";
}
return 0;
}