dsu on tree
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10, M = N * 2;
typedef long long LL;
int n;
int color[N], son[N], sz[N], cnt[N];
int h[N], e[M], ne[M], idx;
LL ans[N];
int mx;
LL sum;
void add(int a, int b) {
e[idx] = b;
ne[idx] = h[a];
h[a] = idx++;
}
void dfs_son(int u, int fa) {
sz[u] = 1;
for(int i = h[u]; ~i; i = ne[i]) {
int j = e[i];
if(j == fa) continue;
dfs_son(j, u);
sz[u] += sz[j];
if(sz[j] > sz[son[u]]) son[u] = j;
}
// cout << u << " " << son[u] << endl;
}
void update(int u, int fa, int sign, int pson) {
int c = color[u];
cnt[c] += sign;
if(cnt[c] > mx) mx = cnt[c], sum = c;
else if(cnt[c] == mx)sum += c;
for(int i = h[u]; ~i; i = ne[i]) {
int j = e[i];
if(j == fa || j == pson) continue;
update(j, u, sign, pson);
}
}
void dfs(int u, int fa, int type) {
for(int i = h[u]; ~i; i = ne[i]) {
int j = e[i];
if(j == fa || j == son[u]) continue;
dfs(j, u, 0);
}
if(son[u]) dfs(son[u], u, 1);
update(u, fa, 1, son[u]);
ans[u] = sum;
// cout << u << " " << sum << endl;
if(type == 0) update(u, fa, -1, 0), sum = mx = 0;
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; ++i) scanf("%d", &color[i]);
memset(h, -1, sizeof h);
for(int i = 1; i < n; ++i) {
int a, b;
scanf("%d%d", &a, &b);
add(a, b);
add(b, a);
}
dfs_son(1, -1);
dfs(1, -1, 1);
for(int i = 1; i <= n; ++i) printf("%lld ", ans[i]);
putchar('\n');
return 0;
}