#include <bits/stdc++.h>
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
using namespace std;
#define int long long
#define fr first
#define sc second
inline int read(){
int res=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') {res=res*10+(c-'0');c=getchar();}
return res*f;
}
const int N=1e5+5;
int n,a[N],siz[N],bson[N],cnt[N],mx,ans[N];
vector<int>e[N],id;
void init_siz(int u,int fa){
for (auto v:e[u]){
if (v==fa) continue;
init_siz(v,u),siz[u]+=siz[v];
if (siz[v]>siz[bson[u]]) bson[u]=v;
}
siz[u]++;
}
void add(int u){
if (++cnt[a[u]]>mx){
mx=cnt[a[u]];
id.clear(),id.push_back(a[u]);
}
else if (cnt[a[u]]==mx) id.push_back(a[u]);
}
void color(int u,int fa){
add(u);
for (auto v:e[u]){
if (v==fa) continue;
color(v,u);
}
}
void clears(int u,int fa){
cnt[a[u]]--;
for (auto v:e[u]){
if (v==fa) continue;
clears(v,u);
}
}
void dfs(int u,int fa,int op){
for (auto v:e[u]){
if (v==fa||v==bson[u]) continue;
dfs(v,u,0);
}
if (bson[u]!=0) dfs(bson[u],u,1);
for (auto v:e[u]){
if (v==fa||v==bson[u]) continue;
color(v,u);
}
add(u);
for (auto i:id) ans[u]+=i;
if (op) return;
clears(u,fa);
id.clear(),mx=0;
}
signed main(){
n=read();
for (int i=1;i<=n;i++) a[i]=read();
for (int i=1;i<n;i++){
int u=read(),v=read();
e[u].push_back(v),e[v].push_back(u);
}
init_siz(1,0);
dfs(1,0,1);
for (int i=1;i<=n;i++) printf("%lld ",ans[i]);
return 0;
}