#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=3e5+5;
#define ls(x) x<<1
#define rs(x) x<<1|1
int n;
int a[N];
int x,y;
vector<int>G[N];
int fa[N],sz[N],dep[N],son[N],dfn[N],cnt,top[N];
int siz[N<<2];
int w[N<<2],lzy[N<<2];
void dfs1(int u,int father){
fa[u]=father;
sz[u]=1;
dep[u]=dep[father]+1;
for(int v:G[u]){
if(v==father){
continue;
}
dfs1(v,u);
sz[u]+=sz[v];
if(sz[v]>sz[son[u]]){
son[u]=v;
}
}
}
void dfs2(int u,int tp){
dfn[u]=++cnt,top[u]=tp;
if(!son[u]){
return;
}
dfs2(son[u],tp);
for(int v:G[u]){
if(v!=son[u]&&v!=fa[u]){
dfs2(v,v);
}
}
}
void pushup(int u){
w[u]=w[ls(u)]+w[rs(u)];
}
void build(int u,int l,int r){
siz[u]=r-l+1;
if(l==r){
return;
}
int mid=l+r>>1;
build(ls(u),l,mid);
build(rs(u),mid+1,r);
pushup(u);
}
void pushdown(int u){
if(lzy[u]){
lzy[ls(u)]+=lzy[u];
lzy[rs(u)]+=lzy[u];
w[ls(u)]+=lzy[u]*siz[ls(u)];
w[rs(u)]+=lzy[u]*siz[rs(u)];
lzy[u]=0;
}
}
void modify(int u,int l,int r,int L,int R){
if(L<=l&&r<=R){
w[u]+=siz[u];
lzy[u]++;
}
else if(!(R<l||r<L)){
pushdown(u);
int mid=l+r>>1;
modify(ls(u),l,mid,L,R);
modify(rs(u),mid+1,r,L,R);
pushup(u);
}
}
void add(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]){
swap(x,y);
}
modify(1,1,n,dfn[top[x]],dfn[x]);
x=fa[top[x]];
}
if(dfn[x]>dfn[y]){
swap(x,y);
}
modify(1,1,n,dfn[x],dfn[y]);
}
int qry(int u,int l,int r,int L,int R){
if(L<=l&&r<=R){
return w[u];
}
else if(!(R<l||r<L)){
pushdown(u);
int mid=l+r>>1;
return qry(ls(u),l,mid,L,R)+qry(rs(u),mid+1,r,L,R);
}
return 0;
}
int minu[N];
int main(){
cin.tie(0)->sync_with_stdio(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<n;i++){
cin>>x>>y;
G[x].push_back(y);
G[y].push_back(x);
}
dfs1(1,0);
dfs2(1,1);
build(1,1,n);
for(int i=1;i<n;i++){
add(dfn[a[i]],dfn[a[i+1]]);
}
for(int i=2;i<=n;i++){
minu[a[i]]++;
}
for(int i=1;i<=n;i++){
cout<<qry(1,1,n,dfn[i],dfn[i])-minu[i]<<"\n";
}
return 0;
}