#include<bits/stdc++.h>
using namespace std;
inline int read(){
register int x=0,f=1;register char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=~f+1;ch=getchar();}
while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
inline void print(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) print(x/10);
putchar(x%10+'0');
return ;
}
const int N=3e5+5;
struct node{
int to,nxt;
}s[N<<1];
int head[N],cnt,depth[N],fa[N][22],b[N],a[N];
inline void add(int a,int b){
s[++cnt].to=b;
s[cnt].nxt=head[a];
head[a]=cnt;
return ;
}
inline void dfs(int u,int father){
depth[u]=depth[father]+1;
fa[u][0]=father;
register int i;
for(i=1;(1<<i)<=depth[u];++i) fa[u][i]=fa[fa[u][i-1]][i-1];
for(i=head[u];i;i=s[i].nxt){
if(s[i].to==father) continue;
dfs(s[i].to, u);
}
return ;
}
inline int LCA(int u,int father){
if(depth[u]<depth[father]) swap(u, father);
register int i;
for(i=22;i>=0;--i) if((1<<i)<=depth[u]-depth[father]) u=fa[u][i];
if(u==father) return u;
for(i=22;i>=0;--i) if(fa[u][i]!=fa[father][i]) u=fa[u][i],father=fa[father][i];
return fa[u][0];
}
inline void get_ans(int u,int father){
register int i;
for(i=head[u];i;i=s[i].nxt){
if(s[i].to==father) continue;
get_ans(s[i].to, u);
b[u]+=b[s[i].to];
}
}
int main(){
register int n=read(),i,u,v,lca;
for(i=1;i<=n;++i) a[i]=read();
for(i=1;i<n;++i){
u=read(),v=read();
add(u, v);
add(v, u);
}
dfs(1, 0);
for(i=1;i<n;++i){
u=a[i],v=a[i+1];
lca=LCA(u, v);
++b[u],++b[v],--b[lca],--b[fa[lca][0]];
}
get_ans(1, 0);
for(i=2;i<=n;++i) b[a[i]]--;
for(i=1;i<=n;++i) print(b[i]),putchar('\n');
return 0;
}