#include<bits/stdc++.h>
using namespace std;
const int maxn=3e5+10;
int aa[maxn];
struct rr{
int le;
int ri;
int lazy;
};
rr tr[maxn*4];
struct ee{
int to;
int next;
};
ee bb[maxn*2];
int head[maxn],fa[maxn],cnt=0,tot=0;
int size[maxn],top[maxn],op[maxn],dep[maxn],dd[maxn];
void build(int rt,int le,int ri)
{
tr[rt].le=le;tr[rt].ri=ri;
tr[rt].lazy=0;
if(le>=ri) return;
//printf("%d:%d-%d\n",rt,tr[rt].le,tr[rt].ri);
int mid=(le+ri)>>1;
build(rt<<1,le,mid);
build(rt<<1|1,mid+1,ri);
return;
}
void down(int rt)
{
int le=rt<<1,ri=rt<<1|1;
tr[le].lazy+=tr[rt].lazy;
tr[ri].lazy+=tr[rt].lazy;
tr[rt].lazy=0;
}
void xgg(int le,int ri,int rt,int k)
{
//cout<<rt<<endl;
if(tr[rt].le>=le&&tr[rt].ri<=ri)
{
tr[rt].lazy+=k;
return;
}
down(rt);
int mid=(tr[rt].le+tr[rt].ri)>>1;
//printf("%d %d %d\n",rt,tr[rt].le,tr[rt].ri);
if(mid>=le)
xgg(le,ri,rt<<1,k);
if(mid<ri)
xgg(le,ri,rt<<1|1,k);
}
int cxx(int x,int rt)
{
if(tr[rt].le==x&&x==tr[rt].ri)
return tr[rt].lazy;
down(rt);
int mid=(tr[rt].le+tr[rt].ri)>>1;
if(mid>=x)
return cxx(x,rt<<1);
else
return cxx(x,rt<<1|1);
}
void dfs(int x,int sd)
{
int ma=0;
size[x]=1;dd[x]=sd;
for(int i=head[x];i;i=bb[i].next)
{
int sx=bb[i].to;
if(sx!=fa[x])
{
dfs(sx,sd+1);
if(size[sx]>ma) op[x]=sx,ma=size[sx];
size[x]+=size[sx];
}
}
}
void xg(int x,int y,int k)
{
while(top[x]!=top[y])
{
//cout<<x<<y<<endl;
if(dd[top[x]]<dd[top[y]]) swap(x,y);
xgg(dep[top[x]],dep[x],1,k);
x=fa[top[x]];
}
if(dd[x]<dd[y])
swap(x,y);
xgg(dep[y],dep[x],1,k);
}
void dfs2(int x)
{
if(x==op[fa[x]])
top[x]=top[fa[x]];
else top[x]=x;
//cout<<x<<" "<<top[x]<<" "<<op[x]<<endl;
dep[x]=++tot;
if(op[x]) dfs2(op[x]);
for(int i=head[x];i;i=bb[i].next)
{
int sx=bb[i].to;
if(sx!=fa[x]&&sx!=op[x])
dfs2(sx);
}
}
void jb(int q,int z)
{
bb[++cnt].to=z;
bb[cnt].next=head[q];
head[q]=cnt;
}
int main()
{
//freopen("in","r",stdin);
//freopen("out","w",stdout);
int n;
scanf("%d",&n);
build(1,1,n);
for(int i=1;i<=n;i++)
scanf("%d",&aa[i]);
fa[1]=1;
for(int i=1;i<n;i++)
{
int a,b;
if(a>b) swap(a,b);
scanf("%d%d",&a,&b);
fa[b]=a;
jb(a,b);
}
dfs(1,1);
dfs2(1);
xg(aa[1],aa[1],1);
for(int i=1;i<n;i++)
xg(aa[i],aa[i+1],1),xg(aa[i],aa[i],-1);
xg(aa[n],aa[n],-1);
for(int i=1;i<=n;i++)
printf("%d\n",cxx(dep[i],1));
return 0;
}
WA劝退标题