rt。不知道为什么错了。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define F(i,a,b) for(int i=a;i<=b;i++)
const int N=8e5+5;
int head[N],nxt[N],to[N],cnt;
inline void AddEdge(int u,int v){
to[++cnt]=v;
nxt[cnt]=head[u];
head[u]=cnt;
}
inline int read();
int n,a[N],Ans,cs[N],Q[N],ans[N],tmp,tot;
int f[N],siz[N],son[N];
inline void dfs(int u,int v){
siz[u]=1;
f[u]=v;
for(int i=head[u];i;i=nxt[i]){
if(to[i]==v) continue;
dfs(to[i],u);
siz[u]+=siz[to[i]];
if(!son[u]||siz[son[u]]<siz[to[i]] ) son[u]=to[i];
}
return;
}
inline void CL(){
while(tot) cs[Q[tot]]=0,tot--;
tmp=Ans=0;
return;
}
inline void Insert(int x){
cs[x]++;
Q[++tot]=x;
if(cs[x]>tmp) tmp=cs[x],Ans=x;
else if(cs[x]==tmp) Ans+=x;
}
inline void Add(int x,int fa){
Insert(a[x]);
for(int i=head[x];i;i=nxt[i]){
if(to[i]==fa) continue;
Add(to[i],x);
}
}
//Dsu On Tree
inline void Solve(int u,int v){
for(int i=head[u];i;i=nxt[i]){
if(to[i]==v||to[i]==son[u]) continue;
Solve(to[i],u);CL();
}
if(son[u]) Solve(son[u],u);
for(int i=head[u];i;i=nxt[i]){
if(to[i]==v||to[i]==son[u])continue;
Add(to[i],u);
}
Insert(u),ans[u]=Ans;
}
signed main(){
n=read();
F(i,1,n) a[i]=read();
F(i,1,n-1) {
int u,v;
u=read(),v=read();
AddEdge(u,v);
AddEdge(v,u);
}
dfs(1,1);
Solve(1,1);
F(i,1,n) cout<<ans[i]<<" ";
return 0;
}
inline int read(){
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f*=-1;
c=getchar();
}
while(c<='9'&&c>='0'){
x=(x<<3)+(x<<1)+(c^48);
c=getchar();
}
return x*f;
}