#include <bits/stdc++.h>
using namespace std;
#define N 300005
vector<int> graph[N];
int ith[N][30],qz[N],z_qz[N],deep[N];
void dfs(int g,int fa,int depth)
{
for(int i = 0;i < graph[g].size();i++)
{
if(graph[g][i] != fa)
{
ith[graph[g][i]][0] = g;
deep[graph[g][i]] = depth + 1;
dfs(graph[g][i],g,depth + 1);
}
}
}
int dfs2(int g,int fa)
{
z_qz[g] = qz[g];
for(int i = 0;i < graph[g].size();i++)
{
if(graph[g][i] != fa) z_qz[g] += dfs2(graph[g][i],g);
}
return z_qz[g];
}
int lca(int u,int v)
{
int k = 0;
int q = deep[u] - deep[v];
if(q < 0)
{
q = -q;
int y = 0;
while(q)
{
if(q & 1) v = ith[v][y];
q >>= 1;
y++;
}
}
else
{
int y = 0;
while(q)
{
if(q & 1) u = ith[u][y];
q >>= 1;
y++;
}
}
if(u == v)
{
return u;
}
while(u != v)
{
int l = 0,r = 30;
while(l <= r)
{
int mid = (l + r) >> 1;
if(ith[u][mid] != ith[v][mid]) l = mid + 1;
else r = mid - 1;
}
u = ith[u][max(r,0)];
v = ith[v][max(r,0)];
}
return u;
}
int ss[N];
signed main()
{
int n,m,root = 1;
cin >> n;
int h,k;
for(int i = 1;i <= n;i++) cin >> ss[i];
for(int i = 1;i < n;i++)
{
cin >> h >> k;
graph[h].push_back(k);
graph[k].push_back(h);
}
dfs(1,-1,1);
for(int i = 0;i < 30;i++) ith[root][i] = root;
for(int i = 1;i < 30;i++)
{
for(int j = 2;j <= n;j++)
{
ith[j][i] = ith[ith[j][i - 1]][i - 1];
}
}
for(int i = 1;i < n;i++)
{
h = ss[i],k = ss[i + 1];
int l = lca(h,k);
qz[h]++;
qz[k]++;
qz[l]--;
qz[ith[l][0]]--;
}
qz[ss[n]]--;
dfs2(1,-1);
for(int i = 1;i <= n;i++) cout << z_qz[i] << endl;
return 0;
}