#include <bits/stdc++.h>
using namespace std;
int n;
int a[300001];
vector<int> p[300001];
int son[300001];
int f[300001];
int siz[300001];
int dep[300001];
void dfs(int x, int fa) {
siz[x] = 1;
f[x] = fa;
dep[x] = dep[fa] + 1;
for (int i = 0; i < p[x].size(); i++) {
if (p[x][i] == fa) continue;
dfs(p[x][i], x);
siz[x] += siz[p[x][i]];
if (siz[son[x]] < siz[p[x][i]])
son[x] = p[x][i];
}
return;
}
int top[300001];
void dfs2(int x, int tp) {
top[x] = tp;
if (!son[x]) return;
dfs2(son[x], tp);
for (int i = 0; i < p[x].size(); i++) {
if (p[x][i] == f[x] || p[x][i] == son[x]) continue;
dfs2(p[x][i], p[x][i]);
}
return;
}
int LCA(int x, int y) {
while (top[x] != top[y]) {
if (dep[top[x]] < dep[top[y]])
swap(x, y);
x = f[top[x]];
}
if (dep[x] < dep[y]) return x;
else return y;
}
int val[300001];
void solve(int x, int y) {
int lca = LCA(x, y);
val[x]++;
val[y]++;
val[lca]--;
val[f[lca]]--;
return;
}
void add(int x, int fa) {
for (int i = 0; i < p[x].size(); i++) {
if (p[x][i] == fa) continue;
add(p[x][i], x);
val[x] += val[p[x][i]];
}
return;
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i < n; i++) {
int x, y;
cin >> x >> y;
p[x].push_back(y);
p[y].push_back(x);
}
dfs(1, 0);
dfs2(1, 1);
for (int i = 2; i <= n; i++) {
solve(a[i - 1], a[i]);
val[a[i]]--;
}
add(1, 0);
val[n] = 0;
for (int i = 1; i <= n; i++)
cout << val[i] << " ";
return 0;
}