#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int N = 1e5 + 5;
int n;
int c[N];
vector<int> adj[N];
map<int, int> cnt[N]; // cnt[u][c] = Số đỉnh có mã màu c trong cây con gốc u
int mx_cnt[N]; // mx_cnt[u] = Số lần xuất hiện của mã màu có số lần xuất hiện nhiều nhất trong cây con gốc u
ll sum[N]; // sum[u] = Tổng của những mã màu có số lần xuất hiện nhiều nhất trong cây con gốc u
ll ans[N]; // ans[u] = Đáp án của cây con gốc u
void dfs(int u, int p) {
cnt[u][c[u]]++;
mx_cnt[u] = 1;
sum[u] = c[u];
for (int v : adj[u]) {
if (v == p) continue;
dfs(v, u);
if (cnt[u].size() < cnt[v].size()) {
swap(cnt[u], cnt[v]);
swap(mx_cnt[u], mx_cnt[v]);
swap(sum[u], sum[v]);
}
for (auto it : cnt[v]) {
int new_cnt = cnt[u][it.first] + it.second;
cnt[u][it.first] = new_cnt;
if (mx_cnt[u] < new_cnt) {
mx_cnt[u] = new_cnt;
sum[u] = it.first;
}
else if (mx_cnt[u] == new_cnt) {
sum[u] += it.first;
}
}
}
ans[u] = sum[u];
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int u = 1; u <= n; u++) cin >> c[u];
for (int i = 0; i < n - 1; i++) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
dfs(1, -1);
for (int u = 1; u <= n; u++) {
cout << ans[u] << ' ';
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKY29uc3QgaW50IE4gPSAxZTUgKyA1OyAKCmludCBuOyAgCmludCBjW05dOyAgCnZlY3RvcjxpbnQ+IGFkaltOXTsgICAKCm1hcDxpbnQsIGludD4gY250W05dOyAvLyBjbnRbdV1bY10gPSBT4buRIMSR4buJbmggY8OzIG3DoyBtw6B1IGMgdHJvbmcgY8OieSBjb24gZ+G7kWMgdSAKaW50IG14X2NudFtOXTsgLy8gbXhfY250W3VdID0gU+G7kSBs4bqnbiB4deG6pXQgaGnhu4duIGPhu6dhIG3DoyBtw6B1IGPDsyBz4buRIGzhuqduIHh14bqldCBoaeG7h24gbmhp4buBdSBuaOG6pXQgdHJvbmcgY8OieSBjb24gZ+G7kWMgdSAKbGwgc3VtW05dOyAvLyBzdW1bdV0gPSBU4buVbmcgY+G7p2Egbmjhu69uZyBtw6MgbcOgdSBjw7Mgc+G7kSBs4bqnbiB4deG6pXQgaGnhu4duIG5oaeG7gXUgbmjhuqV0IHRyb25nIGPDonkgY29uIGfhu5FjIHUgCmxsIGFuc1tOXTsgLy8gYW5zW3VdID0gxJDDoXAgw6FuIGPhu6dhIGPDonkgY29uIGfhu5FjIHUgCgp2b2lkIGRmcyhpbnQgdSwgaW50IHApIHsKCWNudFt1XVtjW3VdXSsrOyAKCW14X2NudFt1XSA9IDE7ICAKCXN1bVt1XSA9IGNbdV07ICAKCglmb3IgKGludCB2IDogYWRqW3VdKSB7CgkJaWYgKHYgPT0gcCkgY29udGludWU7ICAgCgkJCgkJZGZzKHYsIHUpOyAgCgkJCgkJaWYgKGNudFt1XS5zaXplKCkgPCBjbnRbdl0uc2l6ZSgpKSB7CgkJCXN3YXAoY250W3VdLCBjbnRbdl0pOyAgIAoJCQlzd2FwKG14X2NudFt1XSwgbXhfY250W3ZdKTsgIAoJCQlzd2FwKHN1bVt1XSwgc3VtW3ZdKTsgCgkJfQoKCQlmb3IgKGF1dG8gaXQgOiBjbnRbdl0pIHsKCQkJaW50IG5ld19jbnQgPSBjbnRbdV1baXQuZmlyc3RdICsgaXQuc2Vjb25kOyAgCgkJCWNudFt1XVtpdC5maXJzdF0gPSBuZXdfY250OyAKCQkJCgkJCWlmIChteF9jbnRbdV0gPCBuZXdfY250KSB7CgkJCQlteF9jbnRbdV0gPSBuZXdfY250OyAgCgkJCQlzdW1bdV0gPSBpdC5maXJzdDsgCgkJCX0KCQkJZWxzZSBpZiAobXhfY250W3VdID09IG5ld19jbnQpIHsKCQkJCXN1bVt1XSArPSBpdC5maXJzdDsgCgkJCX0KCQl9CQoJfQoKCWFuc1t1XSA9IHN1bVt1XTsgCn0KCmludCBtYWluKCkgewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyAKCWNpbi50aWUobnVsbHB0cik7IAkKCWNpbiA+PiBuOyAKCQoJZm9yIChpbnQgdSA9IDE7IHUgPD0gbjsgdSsrKSBjaW4gPj4gY1t1XTsgICAKCglmb3IgKGludCBpID0gMDsgaSA8IG4gLSAxOyBpKyspIHsKCQlpbnQgdSwgdjsgCgkJY2luID4+IHUgPj4gdjsgCgkJYWRqW3VdLnB1c2hfYmFjayh2KTsgCgkJYWRqW3ZdLnB1c2hfYmFjayh1KTsgCgl9CgoJZGZzKDEsIC0xKTsgIAoKCWZvciAoaW50IHUgPSAxOyB1IDw9IG47IHUrKykgewoJCWNvdXQgPDwgYW5zW3VdIDw8ICcgJzsgCgl9Cn0=