#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 = 2e5 + 5;
int n;
int c[N];
vector<int> adj[N];
set<int> s[N]; // s[u] = tập hợp các mã màu có trong cây con gốc u
// Lưu ý: sau khi duyệt xong cây có thể s[u] không còn đúng nữa
int ans[N]; // ans[u] = Đáp án cho cây con gốc u
void dfs(int u, int p) {
s[u].insert(c[u]);
for (int v : adj[u]) {
if (v == p) continue;
dfs(v, u);
// Lúc này đã biết s[v]
// Gộp s[v] với s[u]
if (s[u].size() < s[v].size()) swap(s[u], s[v]); // Chi phí swap 2 CTDL trong C++
// như vector, set, multiset, map,... là O(1)
for (auto it : s[v]) s[u].insert(it);
}
// Lúc này đã biết s[u]
ans[u] = s[u].size();
}
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+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKY29uc3QgaW50IE4gPSAyZTUgKyA1OyAKCmludCBuOyAgCmludCBjW05dOyAKdmVjdG9yPGludD4gYWRqW05dOyAKCnNldDxpbnQ+IHNbTl07IC8vIHNbdV0gPSB04bqtcCBo4bujcCBjw6FjIG3DoyBtw6B1IGPDsyB0cm9uZyBjw6J5IGNvbiBn4buRYyB1IAoJCQkgICAvLyBMxrB1IMO9OiBzYXUga2hpIGR1eeG7h3QgeG9uZyBjw6J5IGPDsyB0aOG7gyBzW3VdIGtow7RuZyBjw7JuIMSRw7puZyBu4buvYQppbnQgYW5zW05dOyAvLyBhbnNbdV0gPSDEkMOhcCDDoW4gY2hvIGPDonkgY29uIGfhu5FjIHUgCgp2b2lkIGRmcyhpbnQgdSwgaW50IHApIHsKCXNbdV0uaW5zZXJ0KGNbdV0pOyAgIAoKCWZvciAoaW50IHYgOiBhZGpbdV0pIHsKCQlpZiAodiA9PSBwKSBjb250aW51ZTsgIAoJCWRmcyh2LCB1KTsgIAoJCS8vIEzDumMgbsOgeSDEkcOjIGJp4bq/dCBzW3ZdCgkJLy8gR+G7mXAgc1t2XSB24bubaSBzW3VdIAoJCWlmIChzW3VdLnNpemUoKSA8IHNbdl0uc2l6ZSgpKSBzd2FwKHNbdV0sIHNbdl0pOyAvLyBDaGkgcGjDrSBzd2FwIDIgQ1RETCB0cm9uZyBDKysgCgkJCQkJCQkJCQkJCQkJIC8vIG5oxrAgdmVjdG9yLCBzZXQsIG11bHRpc2V0LCBtYXAsLi4uIGzDoCBPKDEpCgkJZm9yIChhdXRvIGl0IDogc1t2XSkgc1t1XS5pbnNlcnQoaXQpOyAgCgl9CgkKCS8vIEzDumMgbsOgeSDEkcOjIGJp4bq/dCBzW3VdCglhbnNbdV0gPSBzW3VdLnNpemUoKTsgCn0KCmludCBtYWluKCkgewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyAKCWNpbi50aWUobnVsbHB0cik7IAkKCWNpbiA+PiBuOyAKCWZvciAoaW50IHUgPSAxOyB1IDw9IG47IHUrKykgY2luID4+IGNbdV07IAoKCWZvciAoaW50IGkgPSAwOyBpIDwgbiAtIDE7IGkrKykgewoJCWludCB1LCB2OyAKCQljaW4gPj4gdSA+PiB2OyAKCQlhZGpbdV0ucHVzaF9iYWNrKHYpOyAKCQlhZGpbdl0ucHVzaF9iYWNrKHUpOyAKCX0KCglkZnMoMSwgLTEpOyAKCglmb3IgKGludCB1ID0gMTsgdSA8PSBuOyB1KyspIGNvdXQgPDwgYW5zW3VdIDw8ICcgJzsgCn0K