#include<cstdio>
#include<deque>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int N=3e5+5;
int n,a[N];
struct node{
int fa,dep,top,size,son,_,ans;
deque<int>sons;
};
node tree[N];
void dfs1(int u,int father){
tree[u].fa=father;
tree[u].dep=tree[father].dep+1;
tree[u].size=1;
for(int v:tree[u].sons){
if(v==father) continue;
dfs1(v,u);
tree[u].size+=tree[v].size;
if(tree[tree[u].son].size<tree[v].size)
tree[u].son=v;
}
}
void dfs2(int u,int t){
tree[u].top=t;
if(!tree[u].son) return;
dfs2(tree[u].son,t);
for(int v:tree[u].sons){
if(v==tree[u].fa||v==tree[u].son)
continue;
dfs2(v,v);
}
}
int LCA(int u,int v){
while(tree[u].top!=tree[v].top){
if(tree[tree[u].top].dep<tree[tree[v].top].dep)
swap(u,v);
u=tree[tree[u].top].fa;
}
return tree[u].dep<tree[v].dep?u:v;
}
void dfs3(int u){
tree[u].ans=tree[u]._;
for(int v:tree[u].sons){
if(v==tree[u].fa) continue;
dfs3(v);
tree[u].ans+=tree[v].ans;
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n-1;i++){
int u,v;
scanf("%d%d",&u,&v);
tree[u].sons.push_back(v);
tree[v].sons.push_back(u);
}
dfs1(1,0);
dfs2(1,1);
for(int i=2;i<=n;i++){
int lca=LCA(a[i-1],a[i]);
tree[a[i-1]]._++;tree[a[i]]._++;
tree[lca]._--;tree[tree[lca].fa]._--;
}
dfs3(1);
for(int i=2;i<=n;i++)
tree[a[i]].ans--;
for_each(tree+1,tree+n+1,[=](const node &x){
printf("%d\n",x.ans);
});
return 0;
}