#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll read()
{
ll x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
ll n;
ll u,v,maxn,sum;
vector<ll> e[100010];
ll son[100010],size[100010];
ll c[100010],ans[100010];
ll ap[100010];
void dfs(ll t,ll fa){
size[t]=1;
for (int i=1;i<e[t].size();i++){
if(e[t][i]==fa) continue;
dfs(e[t][i],t);
if(size[son[t]]<size[e[t][i]]){
son[t]=e[t][i];
}
}
}
void init(ll t,ll fa){
ap[c[t]]--;
for (int i=0;i<e[t].size();i++){
if(e[t][i]!=fa){
init(e[t][i],t);
}
}
}
void DFS(ll t,ll fa){
ap[c[t]]++;
if(ap[c[t]]>maxn){
maxn=ap[c[t]];
sum=c[t];
} else if(ap[c[t]]==maxn){
sum+=c[t];
}
for (int i=0;i<e[t].size();i++){
if(e[t][i]==son[t]||e[t][i]==fa) continue;
DFS(e[t][i],t);
}
}
void dfs1(ll t,ll f){
for (int i=0;i<e[t].size();i++){
if(e[t][i]==f||e[t][i]==son[t]) continue;
dfs1(e[t][i],t);
init(e[t][i],t);
sum=0;
maxn=0;
}
if(son[t])dfs1(son[t],t);
DFS(t,f);
ans[t]=sum;
}
signed main(){
n=read();
for (int i=1;i<=n;i++){
c[i]=read();
}
for (int i=1;i<n;i++){
u=read();
v=read();
e[u].push_back(v);
e[v].push_back(u);
}
dfs(1,0);
dfs1(1,0);
for (int i=1;i<=n;i++){
printf("%lld ",ans[i]);
}
}
样例二没过