#include <bits/stdc++.h>
#define ll long long
const int N=1e5+10, M=1<<14, inf=1e9+10;
inline int read() {
int x=0, f=1;
char ch=getchar();
for (; !isdigit(ch); ch=getchar()) if (ch=='-') f=-1;
for (; isdigit(ch); ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);
return x*=f;
}
using namespace std;
int n, tot, col[N], dfn[N];
ll ans[N];
vector< int> G[N];
struct S {
map< int, int> cnt;
vector< int> in;
ll ans=0; int mx=0;
void add( int x) {
if (++cnt[col[x]]>mx) mx=cnt[col[x]], ans=col[x];
else if (cnt[col[x]]==mx) ans+=col[x];
in.push_back(x);
}
int siz() { return in.size(); }
} Set[N];
void dfs( int u, int fu) {
dfn[u]=++tot; int msiz=0, son=0;
for ( auto v:G[u]) {
if (v==fu) continue ;
dfs(v, u);
if (Set[dfn[v]].siz()>msiz) msiz=Set[dfn[u]].siz(), son=v;
}
if (!son) return Set[dfn[u]].add(u), ans[u]=Set[dfn[u]].ans, void();
dfn[u]=dfn[son];
for ( auto v:G[u]) if (v!=fu&&v!=son) for ( auto x:Set[dfn[v]].in) Set[dfn[u]].add(x);
Set[dfn[u]].add(u), ans[u]=Set[dfn[u]].ans;
}
signed main() {
n=read();
for ( int i=1; i<=n; i++) col[i]=read();
for ( int i=1, u, v; i<n; i++) u=read(), v=read(), G[u].push_back(v), G[v].push_back(u);
dfs(1, 0);
for ( int i=1; i<=n; i++) cout<<ans[i]<<" ";
}