统计子树出现最多的颜色编号之和
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int h[N],con=1,nex[N*2],to[N*2];
int col[N],sz[N],son[N],f,cnt[N],mc;
ll ans[N],sum;
void add(int a,int b)
{
nex[con]=h[a];
h[a]=con;
to[con++]=b;
}
int dfs(int now,int fa)
{
sz[now]=1;
son[now]=0;
for(int i=h[now];i;i=nex[i])
{
if(to[i]==fa)
continue;
sz[now]+=dfs(to[i],now);
if(sz[to[i]]>sz[son[now]])
son[now]=to[i];
}
return sz[now];
}
void cal(int now,int fa,int v)
{
cnt[col[now]]+=v;
if(cnt[col[now]]>mc)
{
mc=cnt[col[now]];
sum=col[now];
}
else if(cnt[col[now]]==mc)
{
sum+=col[now];
}
for(int i=h[now];i;i=nex[i])
{
if(to[i]==fa||to[i]==f)
continue;
cal(to[i],now,v);
}
}
void div(int now,int fa,int kp)
{
// cout<<now<<' '<<son[now]<<endl;
for(int i=h[now];i;i=nex[i])
{
if(to[i]==fa||to[i]==son[now])
continue;
div(to[i],now,1);
}
if(son[now])
{
div(son[now],now,0);
f=son[now];
}
cal(now,fa,1);
f=0;
ans[now]=sum;
if(kp)
{
cal(now,fa,-1);
sum=mc=0;
}
}
int main()
{
//freopen("1.txt","r",stdin);
int n;cin>>n;
for(int i=1;i<=n;++i)
scanf("%d",&col[i]);
for(int i=1;i<n;++i)
{
int a,b;scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
dfs(1,0);
div(1,0,0);
for(int i=1;i<=n;++i)
printf("%lld ",ans[i]);
return 0;
}