https://codeforces.com/contest/600/submission/188568254
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
struct edge {
int to, next;
} e[N];
long long n, u, v, edge_cnt, cnt, now, qwq, c[N], ans[N], head[N], siz[N], ap[N], fa[N], son[N];
void dfs1(int u, int fat) {
fa[u] = fat, siz[u] = 1;
for (int i = head[u]; i; i = e[i].next) {
int v = e[i].to;
if (v == fa[u]) continue;
dfs1(v, u), siz[u] += siz[v];
if (siz[v] > siz[son[u]]) son[u] = v;
}
}
void insert(int u) {
if (++ ap[c[u]] == qwq) now += c[u];
if (ap[c[u]] > qwq) now = c[u], qwq = ap[c[u]];
}
void clean(int u) {
qwq = now = 0, ap[c[u]] --;
for (int i = head[u]; i; i = e[i].next)
if (e[i].to != fa[u]) clean(e[i].to);
}
void addtree(int u) {
insert(u);
for (int i = head[u]; i; i = e[i].next)
if (e[i].to != fa[u]) addtree(e[i].to);
}
void dfs2(int u) {
for (int i = head[u]; i; i = e[i].next)
if (e[i].to != fa[u] && e[i].to != son[u]) dfs2(e[i].to), clean(e[i].to);
if (son[u]) dfs2(son[u]);
for (int i = head[u]; i; i = e[i].next)
if (e[i].to != fa[u] && e[i].to != son[u]) addtree(e[i].to);
insert(u), ans[u] = now;
}
void add(int u, int v) {
e[++ edge_cnt].to = v;
e[edge_cnt].next = head[u];
head[u] = edge_cnt;
}
int main() {
cin >> n;
for (int i = 1; i <= n; i ++)
cin >> c[i];
for (int i = 1; i < n; i ++)
cin >> u >> v, add(u, v);
dfs1(1, 0), dfs2(1);
for (int i = 1; i <= n; i ++)
cout << ans[i] << ' ';
cout << '\n';
return 0;
}