#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];
void compress(int c[]) {
vector<int> vals;
for (int i = 1; i <= n; i++) vals.push_back(c[i]);
sort(vals.begin(), vals.end());
vals.resize(unique(vals.begin(), vals.end()) - vals.begin());
for (int i = 1; i <= n; i++) {
c[i] = lower_bound(vals.begin(), vals.end(), c[i]) - vals.begin();
}
}
int euler_tour[N];
int tin[N], tout[N], timer;
void dfs(int u, int p) {
tin[u] = ++timer;
euler_tour[timer] = u;
for (int v : adj[u]) {
if (v == p) continue;
dfs(v, u);
}
tout[u] = timer;
}
// - Cây con gốc u sẽ tương ứng với đoạn [tin(u), tout(u)] trên Euler Tour
// => Đưa về bài toán đếm số phần tử phân biệt nằm trong đoạn (Tham khảo sol của anh bài D-query)
struct Fenwick {
int n;
vector<int> ft;
Fenwick(int n) : n(n) {
ft.resize(n, 0);
}
void update(int pos, int val) {
for (; pos < n; pos += pos & (-pos)) {
ft[pos] += val;
}
}
int get(int pos) {
int ans = 0;
for (; pos > 0; pos -= pos & (-pos)) {
ans += ft[pos];
}
return ans;
}
};
vector<int> queries[N]; // queries[R] = danh sách những truy vấn có đầu mút r = R
int last[N]; // last[x] = i gần nhất sao cho c[i] == x
int pre[N]; // pre[i] = j gần nhất sao cho c[j] == c[i]
int ans[N]; // ans[u] = Đáp án của cây con gốc u
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int u = 1; u <= n; u++) {
cin >> c[u];
}
compress(c);
for (int i = 0; i < n - 1; i++) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
timer = 0;
dfs(1, -1);
for (int u = 1; u <= n; u++) {
queries[tout[u]].push_back(u);
}
for (int i = 1; i <= n; i++) {
int u = euler_tour[i];
pre[i] = last[c[u]];
last[c[u]] = i;
}
Fenwick fenw(n + 1);
for (int r = 1; r <= n; r++) {
if (pre[r] > 0) fenw.update(pre[r], -1);
fenw.update(r, 1);
for (int u : queries[r]) {
ans[u] = fenw.get(r) - fenw.get(tin[u] - 1);
}
}
for (int u = 1; u <= n; u++) {
cout << ans[u] << ' ';
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKY29uc3QgaW50IE4gPSAyZTUgKyA1OyAKCmludCBuOyAKaW50IGNbTl07IAp2ZWN0b3I8aW50PiBhZGpbTl07IAoKdm9pZCBjb21wcmVzcyhpbnQgY1tdKSB7Cgl2ZWN0b3I8aW50PiB2YWxzOyAgCglmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHZhbHMucHVzaF9iYWNrKGNbaV0pOyAgCglzb3J0KHZhbHMuYmVnaW4oKSwgdmFscy5lbmQoKSk7ICAKCXZhbHMucmVzaXplKHVuaXF1ZSh2YWxzLmJlZ2luKCksIHZhbHMuZW5kKCkpIC0gdmFscy5iZWdpbigpKTsgIAoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJY1tpXSA9IGxvd2VyX2JvdW5kKHZhbHMuYmVnaW4oKSwgdmFscy5lbmQoKSwgY1tpXSkgLSB2YWxzLmJlZ2luKCk7IAoJfQp9CgppbnQgZXVsZXJfdG91cltOXTsgIAppbnQgdGluW05dLCB0b3V0W05dLCB0aW1lcjsgICAKCnZvaWQgZGZzKGludCB1LCBpbnQgcCkgewoJdGluW3VdID0gKyt0aW1lcjsgIAoJZXVsZXJfdG91clt0aW1lcl0gPSB1OyAgCglmb3IgKGludCB2IDogYWRqW3VdKSB7CgkJaWYgKHYgPT0gcCkgY29udGludWU7ICAKCQlkZnModiwgdSk7IAoJfQoJdG91dFt1XSA9IHRpbWVyOyAKfQoKLy8gLSBDw6J5IGNvbiBn4buRYyB1IHPhur0gdMawxqFuZyDhu6luZyB24bubaSDEkW/huqFuIFt0aW4odSksIHRvdXQodSldIHRyw6puIEV1bGVyIFRvdXIgCi8vID0+IMSQxrBhIHbhu4EgYsOgaSB0b8OhbiDEkeG6v20gc+G7kSBwaOG6p24gdOG7rSBwaMOibiBiaeG7h3QgbuG6sW0gdHJvbmcgxJFv4bqhbiAoVGhhbSBraOG6o28gc29sIGPhu6dhIGFuaCBiw6BpIEQtcXVlcnkpCgpzdHJ1Y3QgRmVud2ljayB7CglpbnQgbjsgIAoJdmVjdG9yPGludD4gZnQ7IAoKCUZlbndpY2soaW50IG4pIDogbihuKSB7CgkJZnQucmVzaXplKG4sIDApOyAKCX0KCgl2b2lkIHVwZGF0ZShpbnQgcG9zLCBpbnQgdmFsKSB7CgkJZm9yICg7IHBvcyA8IG47IHBvcyArPSBwb3MgJiAoLXBvcykpIHsKCQkJZnRbcG9zXSArPSB2YWw7IAoJCX0KCX0KCglpbnQgZ2V0KGludCBwb3MpIHsKCQlpbnQgYW5zID0gMDsgIAoJCWZvciAoOyBwb3MgPiAwOyBwb3MgLT0gcG9zICYgKC1wb3MpKSB7CgkJCWFucyArPSBmdFtwb3NdOwoJCX0KCQlyZXR1cm4gYW5zOyAKCX0KfTsgCgp2ZWN0b3I8aW50PiBxdWVyaWVzW05dOyAvLyBxdWVyaWVzW1JdID0gZGFuaCBzw6FjaCBuaOG7r25nIHRydXkgduG6pW4gY8OzIMSR4bqndSBtw7p0IHIgPSBSCmludCBsYXN0W05dOyAvLyBsYXN0W3hdID0gaSBn4bqnbiBuaOG6pXQgc2FvIGNobyBjW2ldID09IHgKaW50IHByZVtOXTsgLy8gcHJlW2ldID0gaiBn4bqnbiBuaOG6pXQgc2FvIGNobyBjW2pdID09IGNbaV0KaW50IGFuc1tOXTsgLy8gYW5zW3VdID0gxJDDoXAgw6FuIGPhu6dhIGPDonkgY29uIGfhu5FjIHUgCgppbnQgbWFpbigpIHsKCWlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgCgljaW4udGllKG51bGxwdHIpOyAJCgljaW4gPj4gbjsgCglmb3IgKGludCB1ID0gMTsgdSA8PSBuOyB1KyspIHsKCQljaW4gPj4gY1t1XTsgCgl9Cgljb21wcmVzcyhjKTsgICAKCglmb3IgKGludCBpID0gMDsgaSA8IG4gLSAxOyBpKyspIHsKCQlpbnQgdSwgdjsgCgkJY2luID4+IHUgPj4gdjsgCgkJYWRqW3VdLnB1c2hfYmFjayh2KTsgCgkJYWRqW3ZdLnB1c2hfYmFjayh1KTsgCgl9CgoJdGltZXIgPSAwOyAgCglkZnMoMSwgLTEpOyAKCglmb3IgKGludCB1ID0gMTsgdSA8PSBuOyB1KyspIHsKCQlxdWVyaWVzW3RvdXRbdV1dLnB1c2hfYmFjayh1KTsgCgl9CgoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJaW50IHUgPSBldWxlcl90b3VyW2ldOyAKCQlwcmVbaV0gPSBsYXN0W2NbdV1dOyAKCQlsYXN0W2NbdV1dID0gaTsgIAoJfQoKCUZlbndpY2sgZmVudyhuICsgMSk7IAoJZm9yIChpbnQgciA9IDE7IHIgPD0gbjsgcisrKSB7CgkJaWYgKHByZVtyXSA+IDApIGZlbncudXBkYXRlKHByZVtyXSwgLTEpOyAgCgkJZmVudy51cGRhdGUociwgMSk7IAoJCWZvciAoaW50IHUgOiBxdWVyaWVzW3JdKSB7CgkJCWFuc1t1XSA9IGZlbncuZ2V0KHIpIC0gZmVudy5nZXQodGluW3VdIC0gMSk7IAoJCX0KCX0KCglmb3IgKGludCB1ID0gMTsgdSA8PSBuOyB1KyspIHsKCQljb3V0IDw8IGFuc1t1XSA8PCAnICc7IAoJfQp9