#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;
const int Q = 1e5 + 5;
const int B = 316; // sqrt(N)
// - Bài toán này có thể giải quyết bằng Thuật toán Mo, kèm với Fenwick Tree
// Độ phức tạp: O((N + Q) * sqrt(N) * log2(N)) với B = sqrt(N)
// - Tuy vẫn đủ để pass nhưng ở đây ta có thể đưa ra nhận xét để không cần phải dùng đến Fenwick Tree
// - Nhận xét:
// + Bản chất của Fenwick Tree là prefix/suffix sum, trong bài này thì là suffix sum
// + Khi ta thay đổi giá trị tại vị trí pos thì suf[1..pos] cũng sẽ bị thay đổi theo (*)
// + Còn với thuật toán Mo thì điểm đặc biệt là ở mỗi bước, con trỏ cur_l hoặc cur_r chỉ dịch 1 đơn vị
// dẫn đến giá trị cnt[c] sẽ chỉ tăng hoặc giảm 1 đơn vị
// + Xét trường hợp cnt[c] -> cnt[c] + 1:
// theo (*) thì sẽ tương ứng với 2 thao tác là giảm đoạn suf[1..cnt[c]] đi 1 đơn vị, và tăng đoạn suf[1..cnt[c] + 1] lên 1 đơn vị
// => Sau 2 thao tác thì đơn giản chỉ là tăng suf[cnt[c] + 1] lên 1 đơn vị
// + Trường hợp cnt[c] -> cnt[c] - 1 hoàn toàn tương tự: sau 2 thao tác thì đơn giản chỉ là giảm suf[cnt[c]] đi 1 đơn vị
// => Do đó ta không cần dùng đến Fenwick Tree mà chỉ cần một mảng suf[] bình thường
// => Độ phức tạp O((N + Q) * sqrt(N)) với B = sqrt(N)
struct Query {
int l, r, k, idx;
bool operator<(const Query &other) const {
if (l / B == other.l / B) {
return (l / B & 1) ? (r > other.r) : (r < other.r);
}
return (l < other.l);
}
};
int n, q;
int c[N];
vector<int> adj[N];
vector<Query> queries;
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;
}
int cnt[N]; // cnt[c] = Số lần xuất hiện của màu c
int suf[N]; // suf[i] = Tổng đoạn [i, n] = Số lượng màu c sao cho cnt[c] >= i
int ans[Q]; // ans[i] = Đáp án cho truy vấn thứ i
void add(int i) {
int u = euler_tour[i];
cnt[c[u]]++;
suf[cnt[c[u]]]++;
}
void remove(int i) {
int u = euler_tour[i];
suf[cnt[c[u]]]--;
cnt[c[u]]--;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> q;
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);
}
timer = 0;
dfs(1, -1);
for (int i = 0; i < q; i++) {
int v, k;
cin >> v >> k;
queries.push_back({tin[v], tout[v], k, i});
}
sort(queries.begin(), queries.end());
int cur_l = 1, cur_r = 0;
for (Query &q : queries) {
while (cur_l > q.l) add(--cur_l);
while (cur_r < q.r) add(++cur_r);
while (cur_l < q.l) remove(cur_l++);
while (cur_r > q.r) remove(cur_r--);
ans[q.idx] = suf[q.k];
}
for (int i = 0; i < q; i++) cout << ans[i] << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKY29uc3QgaW50IE4gPSAxZTUgKyA1OyAKY29uc3QgaW50IFEgPSAxZTUgKyA1OyAKY29uc3QgaW50IEIgPSAzMTY7IC8vIHNxcnQoTikgCgovLyAtIELDoGkgdG/DoW4gbsOgeSBjw7MgdGjhu4MgZ2nhuqNpIHF1eeG6v3QgYuG6sW5nIFRodeG6rXQgdG/DoW4gTW8sIGvDqG0gduG7m2kgRmVud2ljayBUcmVlCi8vICAgxJDhu5kgcGjhu6ljIHThuqFwOiBPKChOICsgUSkgKiBzcXJ0KE4pICogbG9nMihOKSkgduG7m2kgQiA9IHNxcnQoTikKLy8gLSBUdXkgduG6q24gxJHhu6cgxJHhu4MgcGFzcyBuaMawbmcg4bufIMSRw6J5IHRhIGPDsyB0aOG7gyDEkcawYSByYSBuaOG6rW4geMOpdCDEkeG7gyBraMO0bmcgY+G6p24gcGjhuqNpIGTDuW5nIMSR4bq/biBGZW53aWNrIFRyZWUKLy8gLSBOaOG6rW4geMOpdDogCi8vICAgKyBC4bqjbiBjaOG6pXQgY+G7p2EgRmVud2ljayBUcmVlIGzDoCBwcmVmaXgvc3VmZml4IHN1bSwgdHJvbmcgYsOgaSBuw6B5IHRow6wgbMOgIHN1ZmZpeCBzdW0KLy8gICArIEtoaSB0YSB0aGF5IMSR4buVaSBnacOhIHRy4buLIHThuqFpIHbhu4sgdHLDrSBwb3MgdGjDrCBzdWZbMS4ucG9zXSBjxaluZyBz4bq9IGLhu4sgdGhheSDEkeG7lWkgdGhlbyAoKikKLy8gICArIEPDsm4gduG7m2kgdGh14bqtdCB0b8OhbiBNbyB0aMOsIMSRaeG7g20gxJHhurdjIGJp4buHdCBsw6Ag4bufIG3hu5dpIGLGsOG7m2MsIGNvbiB0cuG7jyBjdXJfbCBob+G6t2MgY3VyX3IgY2jhu4kgZOG7i2NoIDEgxJHGoW4gduG7iwovLyAgICAgZOG6q24gxJHhur9uIGdpw6EgdHLhu4sgY250W2NdIHPhur0gY2jhu4kgdMSDbmcgaG/hurdjIGdp4bqjbSAxIMSRxqFuIHbhu4sKLy8gICArIFjDqXQgdHLGsOG7nW5nIGjhu6NwIGNudFtjXSAtPiBjbnRbY10gKyAxOiAKLy8gICAgIHRoZW8gKCopIHRow6wgc+G6vSB0xrDGoW5nIOG7qW5nIHbhu5tpIDIgdGhhbyB0w6FjIGzDoCBnaeG6o20gxJFv4bqhbiBzdWZbMS4uY250W2NdXSDEkWkgMSDEkcahbiB24buLLCB2w6AgdMSDbmcgxJFv4bqhbiBzdWZbMS4uY250W2NdICsgMV0gbMOqbiAxIMSRxqFuIHbhu4sKLy8gICAgID0+IFNhdSAyIHRoYW8gdMOhYyB0aMOsIMSRxqFuIGdp4bqjbiBjaOG7iSBsw6AgdMSDbmcgc3VmW2NudFtjXSArIDFdIGzDqm4gMSDEkcahbiB24buLCi8vICAgKyBUcsaw4budbmcgaOG7o3AgY250W2NdIC0+IGNudFtjXSAtIDEgaG/DoG4gdG/DoG4gdMawxqFuZyB04buxOiBzYXUgMiB0aGFvIHTDoWMgdGjDrCDEkcahbiBnaeG6o24gY2jhu4kgbMOgIGdp4bqjbSBzdWZbY250W2NdXSDEkWkgMSDEkcahbiB24buLICAgICAgIAovLyA9PiBEbyDEkcOzIHRhIGtow7RuZyBj4bqnbiBkw7luZyDEkeG6v24gRmVud2ljayBUcmVlIG3DoCBjaOG7iSBj4bqnbiBt4buZdCBt4bqjbmcgc3VmW10gYsOsbmggdGjGsOG7nW5nCi8vID0+IMSQ4buZIHBo4bupYyB04bqhcCBPKChOICsgUSkgKiBzcXJ0KE4pKSB24bubaSBCID0gc3FydChOKQoKc3RydWN0IFF1ZXJ5IHsKCWludCBsLCByLCBrLCBpZHg7ICAKCWJvb2wgb3BlcmF0b3I8KGNvbnN0IFF1ZXJ5ICZvdGhlcikgY29uc3QgewoJCWlmIChsIC8gQiA9PSBvdGhlci5sIC8gQikgewoJCQlyZXR1cm4gKGwgLyBCICYgMSkgPyAociA+IG90aGVyLnIpIDogKHIgPCBvdGhlci5yKTsgCgkJfQoJCXJldHVybiAobCA8IG90aGVyLmwpOyAKCX0KfTsgCgppbnQgbiwgcTsgCmludCBjW05dOyAKdmVjdG9yPGludD4gYWRqW05dOyAKdmVjdG9yPFF1ZXJ5PiBxdWVyaWVzOyAgCgppbnQgZXVsZXJfdG91cltOXTsKaW50IHRpbltOXSwgdG91dFtOXSwgdGltZXI7ICAKCnZvaWQgZGZzKGludCB1LCBpbnQgcCkgewoJdGluW3VdID0gKyt0aW1lcjsgIAoJZXVsZXJfdG91clt0aW1lcl0gPSB1OyAKCWZvciAoaW50IHYgOiBhZGpbdV0pIHsKCQlpZiAodiA9PSBwKSBjb250aW51ZTsgCgkJZGZzKHYsIHUpOyAKCX0KCXRvdXRbdV0gPSB0aW1lcjsgIAp9CgppbnQgY250W05dOyAvLyBjbnRbY10gPSBT4buRIGzhuqduIHh14bqldCBoaeG7h24gY+G7p2EgbcOgdSBjCmludCBzdWZbTl07IC8vIHN1ZltpXSA9IFThu5VuZyDEkW/huqFuIFtpLCBuXSA9IFPhu5EgbMaw4bujbmcgbcOgdSBjIHNhbyBjaG8gY250W2NdID49IGkgCmludCBhbnNbUV07IC8vIGFuc1tpXSA9IMSQw6FwIMOhbiBjaG8gdHJ1eSB24bqlbiB0aOG7qSBpIAoKdm9pZCBhZGQoaW50IGkpIHsKCWludCB1ID0gZXVsZXJfdG91cltpXTsgCgljbnRbY1t1XV0rKzsgIAoJc3VmW2NudFtjW3VdXV0rKzsgCn0KCnZvaWQgcmVtb3ZlKGludCBpKSB7CglpbnQgdSA9IGV1bGVyX3RvdXJbaV07IAoJc3VmW2NudFtjW3VdXV0tLTsgCgljbnRbY1t1XV0tLTsgCn0KCmludCBtYWluKCkgewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyAKCWNpbi50aWUobnVsbHB0cik7IAkKCWNpbiA+PiBuID4+IHE7IAoJZm9yIChpbnQgdSA9IDE7IHUgPD0gbjsgdSsrKSBjaW4gPj4gY1t1XTsgCgkKCWZvciAoaW50IGkgPSAwOyBpIDwgbiAtIDE7IGkrKykgewoJCWludCB1LCB2OyAKCQljaW4gPj4gdSA+PiB2OyAKCQlhZGpbdV0ucHVzaF9iYWNrKHYpOyAKCQlhZGpbdl0ucHVzaF9iYWNrKHUpOyAKCX0KCgl0aW1lciA9IDA7ICAKCWRmcygxLCAtMSk7ICAgCgoJZm9yIChpbnQgaSA9IDA7IGkgPCBxOyBpKyspIHsKCQlpbnQgdiwgazsgCgkJY2luID4+IHYgPj4gazsgIAoJCXF1ZXJpZXMucHVzaF9iYWNrKHt0aW5bdl0sIHRvdXRbdl0sIGssIGl9KTsgCgl9CgoJc29ydChxdWVyaWVzLmJlZ2luKCksIHF1ZXJpZXMuZW5kKCkpOyAgIAoKCWludCBjdXJfbCA9IDEsIGN1cl9yID0gMDsgCglmb3IgKFF1ZXJ5ICZxIDogcXVlcmllcykgewoJCXdoaWxlIChjdXJfbCA+IHEubCkgYWRkKC0tY3VyX2wpOyAKCQl3aGlsZSAoY3VyX3IgPCBxLnIpIGFkZCgrK2N1cl9yKTsgCgkJd2hpbGUgKGN1cl9sIDwgcS5sKSByZW1vdmUoY3VyX2wrKyk7IAoJCXdoaWxlIChjdXJfciA+IHEucikgcmVtb3ZlKGN1cl9yLS0pOyAKCgkJYW5zW3EuaWR4XSA9IHN1ZltxLmtdOyAKCX0KCglmb3IgKGludCBpID0gMDsgaSA8IHE7IGkrKykgY291dCA8PCBhbnNbaV0gPDwgJ1xuJzsgCn0JCQ==