#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=100005;
int n,m;
ll cnt[MAXN];
ll siz[MAXN];
int son[MAXN];
vector <int> Map[MAXN];
int col[MAXN];
ll sum[MAXN];
int ans[MAXN];
void init(int x)
{
siz[x]=1;
son[x]=-1;
for(vector<int>::iterator it=Map[x].begin();it!=Map[x].end();it++)
{
int u=*it;
init(u);
siz[x]+=siz[u];
if(son[x]==-1||siz[son[x]]<siz[u]) son[x]=u;
}
}
void dfs(int x,int v,int rt)
{
cnt[col[x]]+=v;
if(v==1)
if(cnt[col[x]]>cnt[ans[rt]]) ans[rt]=col[x];
for(vector<int>::iterator it=Map[x].begin();it!=Map[x].end();it++)
dfs(*it,v,rt);
}
void DFS(int x,int op)
{
for(vector<int>::iterator it=Map[x].begin();it!=Map[x].end();it++)
if(*it!=son[x]) DFS(*it,1);
if(son[x]!=-1) DFS(son[x],0);
if(son[x]!=-1) ans[x]=ans[son[x]];
for(vector<int>::iterator it=Map[x].begin();it!=Map[x].end();it++)
if(*it!=son[x]) dfs(*it,1,x);
cnt[col[x]]++;
if(cnt[col[x]]>cnt[ans[x]]) ans[x]=col[x];
for(int i=1;i<=n;i++)
if(cnt[i]==cnt[ans[x]])
sum[x]+=i;
if(op==1)
{
cnt[col[x]]--;
for(vector <int>::iterator it=Map[x].begin();it!=Map[x].end();it++)
dfs(*it,-1,x);
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&col[i]);
for(int i=1;i<=n-1;i++)
{
int x,y;
scanf("%d%d",&x,&y);
Map[x].push_back(y);
}
init(1);
DFS(1,0);
for(int i=1;i<=n;i++)
printf("%lld ",sum[i]);
return 0;
}
WA……