#include<stdio.h>
using namespace std;
const int N = 100005;
int v[N];
int nr, lst[N], urm[N], vf[N], sum[N], drum[N];
bool parinte[N];
void adauga(int x, int y)
{
++nr;
vf[nr] = y;
urm[nr] = lst[x];
lst[x] = nr;
}
void dfs(int x)
{
int p, y;
p = lst[x];
drum[++nr] = x;
if (v[x] != 0)
sum[x] = 1 + sum[drum[nr - v[x]]];
while (p != 0)
{
y = vf[p];
dfs(y);
p = urm[p];
}
nr--;
}
int main ()
{
FILE *in, *out;
in = fopen ("cerere.in", "r");
out = fopen ("cerere.out", "w");
int n;
fscanf (in, "%d", &n);
int i;
for (i = 1; i <= n; i++)
fscanf (in, "%d", &v[i]);
int x, y;
for (i = 1; i <= n; i++)
{
fscanf (in, "%d%d", &x, &y);
adauga(x, y);
parinte[y] = true;
}
for (i = 1; i <= n; i++)
if (parinte[i] == 0)
x = i;
nr = 0;
dfs(x);
for (i = 1; i <= n; i++)
fprintf(out, "%d ", sum[i]);
return 0;
}