func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 1e5, M = 1e4, MOD = 1e9 + 7, INF = 0x3f3f3f3f;   const double eps = 1e-8, pi = acos(-1.0);   int n, m;   vector<int> son[N + 10];   int col[N + 10];   int in[N + 10], out[N + 10], bel[N + 10];   int tot;   int k[N + 10];   struct query {     int l, r, id;   } node[N + 10];   int unit;   int cnt[N + 10];   int k_ti[N + 10];   int ans[N + 10];   bool cmp(query a, query b) {     if (a.l / unit != b.l / unit)       return a.l / unit < b.l / unit;     else       return a.r < b.r;   }   void work() {     memset(cnt, 0, sizeof cnt);     memset(k_ti, 0, sizeof k_ti);     int l = 1, r = 0;     for (int i = 0; i < m; i++) {       while (r < node[i].r) {         r++;         cnt[col[bel[r]]]++;         k_ti[cnt[col[bel[r]]]]++;       }       while (r > node[i].r) {         k_ti[cnt[col[bel[r]]]]--;         cnt[col[bel[r]]]--;         r--;       }       while (l < node[i].l) {         k_ti[cnt[col[bel[l]]]]--;         cnt[col[bel[l]]]--;         l++;       }       while (l > node[i].l) {         l--;         cnt[col[bel[l]]]++;         k_ti[cnt[col[bel[l]]]]++;       }       ans[node[i].id] = k_ti[k[node[i].id]];     }   }   void dfs(int u, int fa) {     in[u] = ++tot;     bel[tot] = u;     for (int i = 0; i < son[u].size(); i++) {       int v = son[u][i];       if (v == fa) continue;       dfs(v, u);     }     out[u] = tot;   }   int main() {     scanf( %d%d , &n, &m);     for (int i = 1; i <= n; i++) scanf( %d , &col[i]);     for (int i = 0; i < n - 1; i++) {       int u, v;       scanf( %d%d , &u, &v);       son[u].push_back(v);       son[v].push_back(u);     }     tot = 0;     dfs(1, -1);     unit = (int)sqrt(n);     for (int i = 0; i < m; i++) {       int v;       scanf( %d%d , &v, &k[i]);       node[i].id = i;       node[i].l = in[v];       node[i].r = out[v];     }     sort(node, node + m, cmp);     work();     for (int i = 0; i < m; i++) printf( %d n , ans[i]);   }   