rt
#include<bits/stdc++.h>
using namespace std;
int n,a[300005],F[300005][30],d[300005];
int head[300005],nxt[600005],to[600005],cnt,ans[300005];
void edge(int u,int v){
nxt[++cnt]=head[u];to[cnt]=v;head[u]=cnt;
nxt[++cnt]=head[v];to[cnt]=u;head[v]=cnt;
}
void dfs1(int u,int fa){
F[u][0]=fa;d[u]=d[fa]+1;
for(int i=1;i<=30;i++)F[u][i]=F[F[u][i-1]][i-1];
for(int i=head[u];i;i=nxt[i])
if(to[i]!=fa)dfs1(to[i],u);
return;
}
int dfs2(int u,int fa){
for(int i=head[u];i;i=nxt[i])
if(to[i]!=fa)ans[u]+=dfs2(to[i],u);
return ans[u];
}
int LCA(int u,int v){
if(d[u]<d[v])swap(u,v);
for(int i=30;i>=0;i--)
if(d[F[u][i]]>=d[v])u=F[u][i];
if(u==v)return u;
for(int i=30;i>=0;i--)
if(F[u][i]!=F[v][i])u=F[u][i],v=F[v][i];
return F[u][0];
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<n;i++){
int a,b;
cin>>a>>b;edge(a,b);
}
dfs1(1,0);
for(int i=1;i<n;i++){
int t=LCA(a[i],a[i+1]);
ans[a[i]]++;ans[a[i+1]]++;
ans[t]--;ans[F[t][0]]--;
}
dfs2(1,0);
for(int i=2;i<=n;i++)ans[i]--;
for(int i=1;i<=n;i++)cout<<ans[i]<<endl;
return 0;
}