#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 1e5 + 7, M = N << 1;
int n;
int h[N], e[M], ne[M], idx;
int col[N], cnt[N];
int sum, maxc;
int siz[N], son[N];
int flag;
long long ans[N];
void add(int a,int b){
e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
void dfs(int u,int fa){
siz[u] = 1;
int maxn = 0;
for(int i = h[u];~i;i = ne[i]){
int j = e[i];
if(j == fa) continue;
dfs(j, u);
siz[u] += siz[j];
if(siz[j] > maxn){
maxn = siz[j];
son[u] = j;
}
}
}
void count(int u,int fa,int val){
cnt[col[u]] += val;
if(cnt[col[u]] > maxc){
maxc = cnt[col[u]];
sum = col[u];
}
else if(cnt[col[u]] == maxc)
sum += col[u];
for(int i = h[u];~i;i = ne[i]){
int j = e[i];
if(j == fa || j == flag) continue;
count(j, u, val);
}
}
void dfs(int u,int fa,bool keep){
for(int i = h[u];~i;i = ne[i]){
int j = e[i];
if(j == fa || j == son[u]) continue;
dfs(j, u, false);
}
if(son[u]){
dfs(son[u], u, true);
flag = son[u];
}
count(u, fa, 1);
ans[u] = sum;
flag = 0;
if(!keep){
count(u, fa, -1);
maxc = sum = 0;
}
}
int main(){
memset(h, -1, sizeof h);
scanf("%d", &n);
for(int i = 1;i <= n;i ++ )
scanf("%d", &col[i]);
for(int i = 1;i < n;i ++ ){
int a, b; scanf("%d%d", &a, &b);
add(a, b), add(b, a);
}
dfs(1, 0);
dfs(1, 0, 0);
for(int i = 1;i <= n;i ++ )
printf("%lld ", ans[i]);
return 0;
}
dalao腻害!