原题
做多了,感觉杠杠的了,hhh
#include<bits/stdc++.h>
#define lson k<<1,l,mid
#define rson k<<1|1,mid+1,r
using namespace std;
const int MX=3e5+9;
int n,a[MX],tot=0,head[MX],u,v;
struct Node{
int to,next;
}edge[MX<<1];
void add(int u,int v){
edge[tot].to=v;
edge[tot].next=head[u];
head[u]=tot++;
}
int fa[MX],siz[MX],son[MX],de[MX];
void dfs1(int u,int f,int deth){
de[u]=deth,fa[u]=f,siz[u]=1,son[u]=0;
for( int i=head[u] ; ~i ; i=edge[i].next ){
int v=edge[i].to;
if( v!=f ){
dfs1(v,u,deth+1);
siz[u]+=siz[v];
if( son[u]==0 || siz[son[u]]<=siz[v] )
son[u]=v;
}
}
}
int top[MX],st[MX],ed[MX],pos[MX],cnt=0;
void dfs2(int u,int tp){
top[u]=tp;
st[u]=++cnt;
pos[cnt]=u;
if( son[u] )
dfs2(son[u],tp);
for( int i=head[u] ; ~i ; i=edge[i].next ){
int v=edge[i].to;
if( v!=fa[u] && v!=son[u] )
dfs2(v,v);
}
ed[u]=cnt;
}
int t[MX<<2],laze[MX<<2],ans[MX];
void pushdown(int k){
if( laze[k] ){
laze[k<<1]+=laze[k];
laze[k<<1|1]+=laze[k];
t[k<<1]+=laze[k];
t[k<<1|1]+=laze[k];
laze[k]=0;
}
}
void pushup(int k){
t[k]=max(t[k<<1],t[k<<1|1]);
return ;
}
void update(int k,int l,int r,int L,int R){
if( L<=l && r<=R ){
laze[k]++;
t[k]++;
return ;
}
pushdown(k);
int mid=(l+r)>>1;
if( L<=mid )
update(lson,L,R);
if( mid<R )
update(rson,L,R);
pushup(k);
}
void vs(int u,int v){
while( top[u]!=top[v] ){
if( de[top[u]]>de[top[v]] )
swap(u,v);
update(1,1,n,st[top[v]],st[v]);
v=fa[top[v]];
}
if( de[u]>de[v] )
swap(u,v);
update(1,1,n,st[u],st[v]);
return ;
}
void yuchuli(int k,int l,int r){
if( l==r ){
ans[pos[l]]=t[k];
return ;
}
pushdown(k);
int mid=(l+r)>>1;
yuchuli(lson);
yuchuli(rson);
}
int main()
{
freopen("input.txt","r",stdin);
memset(head,-1,sizeof(head)); // 别粗心忘记了
scanf("%d",&n);
for( int i=1 ; i<=n ; i++ )
scanf("%d",&a[i]);
for( int i=1 ; i<=n-1 ; i++ ){
scanf("%d %d",&u,&v);
add(u,v),add(v,u);
}
dfs1(1,0,0);
dfs2(1,1);
for( int i=2 ; i<=n ; i++ )
vs(a[i-1],a[i]); // 就是普通的在树链上走而已
yuchuli(1,1,n); // 最后记得把所有的laze全部清空
for( int i=1 ; i<=n ; i++ ){
if( i==a[1] )
printf("%d\n",ans[i]);
else
printf("%d\n",ans[i]-1); // 除了第一个,其他的必须全部-1,
}
return 0;
}