func_code_string: #include <bits/stdc++.h>   using namespace std;   int color[100005];   vector<int> DSK[100005];   int num = 0, block_size;   int S[100005], E[100005], c[100005];   struct query {     int l, r, k, id;   } Q[100005];   void DFS(int u, int pre) {     S[u] = ++num;     c[num] = color[u];     for (int i = 0; i < DSK[u].size(); i++) {       int w = DSK[u][i];       if (w != pre) DFS(w, u);     }     E[u] = num;   }   int cnt[100005], ans[100005], res[100005];   void add(int i) {     cnt[c[i]]++;     ans[cnt[c[i]]]++;   }   void del(int i) {     ans[cnt[c[i]]]--;     cnt[c[i]]--;   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(0);     cout.tie(0);     int n, m;     cin >> n >> m;     for (int i = 1; i <= n; i++) cin >> color[i];     for (int i = 1; i < n; i++) {       int u, v;       cin >> u >> v;       DSK[u].push_back(v);       DSK[v].push_back(u);     }     DFS(1, -1);     for (int i = 1; i <= m; i++) {       int v, k;       cin >> v >> k;       Q[i] = {S[v], E[v], k, i};     }     block_size = sqrt(n);     sort(Q + 1, Q + 1 + m, [](const query &a, const query &b) {       if (a.l / block_size == b.l / block_size) return a.r < b.r;       return a.l / block_size < b.l / block_size;     });     int curL = 1, curR = 0;     for (int i = 1; i <= m; i++) {       int L = Q[i].l, R = Q[i].r;       while (curL > L) {         add(curL - 1);         curL--;       }       while (curR < R) {         add(curR + 1);         curR++;       }       while (curL < L) {         del(curL);         curL++;       }       while (curR > R) {         del(curR);         curR--;       }       res[Q[i].id] = ans[Q[i].k];     }     for (int i = 1; i <= m; i++) cout << res[i] <<   n ;   }   