#include<iostream>
using namespace std;
int n,path[300005];
struct Edge{
int to,next;
}e[300005<<1];
int head[300005],cntedge;
void addedge(int u,int v){
e[++cntedge].to=v;
e[cntedge].next=head[u];
head[u]=cntedge;
}
void daddedge(int u,int v){
addedge(u,v);
addedge(v,u);
}
struct Node{
int fa,dep,id,top,size,h_son;
}nod[300004];
int cntid;
void dfs1(int f,int x){
nod[x].fa=f;
nod[x].dep=nod[f].dep+1;
nod[x].size=1;
for(int i=head[x];i;i=e[i].next){
if(e[i].to==f)continue;
dfs1(x,e[i].to);
if(nod[e[i].to].size>nod[nod[x].h_son].size)nod[x].h_son=e[i].to;
nod[x].size+=nod[e[i].to].size;
}
}
void dfs2(int top,int x){
nod[x].top=top;
nod[x].id=++cntid;
if(nod[x].size==1)return;
dfs2(top,nod[x].h_son);
for(int i=head[x];i;i=e[i].next){
if(e[i].to==nod[x].fa||e[i].to==nod[x].h_son)continue;
dfs2(e[i].to,e[i].to);
}
}
struct SegTree{
#define mid ((l+r)>>1)
int a[300005<<2],t[300005<<2];
int ls(int x){return x<<1;}
int rs(int x){return x<<1|1;}
void add(int x,int l,int r,int k=1){
a[x]+=(r-l+1)*k;
t[x]+=k;
}
void push_down(int x,int l,int r){
if(t[x]){
t[x]=0;
add(ls(x),l,mid,t[x]);
add(rs(x),mid+1,r,t[x]);
}
}
void update(int x){a[x]=a[ls(x)]+a[rs(x)];}
void modify(int x,int l,int r,int ml,int mr,int k=1){
if(ml<=l&&r<=mr){
add(x,l,r,k);
return;
}
push_down(x,l,r);
if(ml<=mid)modify(ls(x),l,mid,ml,mr,k);
if(mr>mid)modify(rs(x),mid+1,r,ml,mr,k);
update(x);
}
int query(int x,int l,int r,int pos){
if(l==r)return a[x];
push_down(x,l,r);
if(pos<=mid)return query(ls(x),l,mid,pos);
else if(pos>mid)return query(rs(x),mid+1,r,pos);
}
#undef mid
}T;
void lca(int s,int t){
while(nod[s].top!=nod[t].top){
if(nod[nod[s].top].dep<nod[nod[t].top].dep)swap(s,t);
T.modify(1,1,n,nod[nod[s].top].id,nod[s].id);
s=nod[nod[s].top].fa;
}
if(nod[s].dep>nod[t].dep)swap(s,t);
T.modify(1,1,n,nod[s].id,nod[t].id);
}
int query(int x){
return T.query(1,1,n,nod[x].id);
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>path[i];
}
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
daddedge(u,v);
}
dfs1(0,1);
dfs2(1,1);
for(int i=1;i<n;i++){
lca(path[i],path[i+1]);
T.modify(1,1,n,nod[path[i+1]].id,nod[path[i+1]].id,-1);
}
for(int i=1;i<=n;i++){
cout<<query(i)<<"\n";
}
return 0;
}