int c[maxn];
int dfn[maxn];
int siz[maxn];
int rk[maxn];
int son[maxn];
int l[maxn];int r[maxn];
int a[maxn];
int cnt;
int root;
int mx;int sum;
int ans[maxn];
void add(int u){
a[c[u]]++;
if(a[c[u]]>mx){
mx=a[c[u]];sum=c[u];
}else if(a[c[u]]==mx){
sum+=c[u];
}
}
void del(int u){
a[c[u]]--;
}
vector<int>e[maxn];
void dfs(int u,int fa){
dfn[u]=++cnt;
l[u]=cnt;
rk[cnt]=u;
siz[u]=1;
son[u]=-1;
for(int v:e[u]){
if(v==fa)continue;
dfs(v,u);
siz[u]+=siz[v];
if(son[u]==-1||siz[v]>siz[son[u]])son[u]=v;
}
r[u]=cnt;
}
void dfs2(int u,int fa,int ok){
for(int v:e[u]){
if(v==fa||v==son[u])continue;
dfs2(v,u,0);
}
if(son[u]!=-1)dfs2(son[u],u,1);
for(int v:e[u]){
if(v==fa||v==son[u])continue;
for(int w=l[v];w<=r[v];w++){
add(rk[w]);
}
}
add(u);
ans[u]=sum;
if(!ok){
for(int w=l[u];w<=r[u];w++){
del(rk[w]);
}
mx=sum=0;
}
}
void solve(){
int n;cin>>n;
root=1;
rep(i,1,n)cin>>c[i];
rep(i,1,n-1){
int u,v;cin>>u>>v;
e[u].pb(v);e[v].pb(u);
}
dfs(root,0);
dfs2(root,0,0);
rep(i,1,n){
cout<<ans[i]<<' ';
}
}