func_code_string: #include <bits/stdc++.h>   using namespace std;   const int mod = 1000 * 1000 * 1000 + 7;   const int INF = 1000 * 1000 * 1000;   const long long LINF = (long long)INF * INF;   struct Query {     int l, r, ind, k;   };   int n, m;   int c[100100];   vector<int> adj[100100];   int cnt[100100], bnd[100100];   int ans[100100];   vector<int> st;   int sttime[100100];   int fntime[100100];   Query qr[100100];   void dfs(int v, int par) {     st.push_back(v);     sttime[v] = st.size() - 1;     for (int u : adj[v]) {       if (u == par) {         continue;       }       dfs(u, v);     }     fntime[v] = st.size() - 1;   }   bool mos_cmp(Query &a, Query &b) {     if (a.l / 400 == b.l / 400) {       return (a.l / 400 % 2 ? a.r > b.r : a.r < b.r);     }     return a.l / 400 < b.l / 400;   }   void mos_add(int i) {     cnt[c[i]]++;     bnd[cnt[c[i]]]++;   }   void mos_rem(int i) {     bnd[cnt[c[i]]]--;     cnt[c[i]]--;   }   int main(void) {     ios::sync_with_stdio(false);     cin.tie(0);     cout.tie(0);     ;     cin >> n >> m;     for (int i = (1); i < (n + 1); i++) {       cin >> c[i];     }     for (int i = (0); i < (n - 1); i++) {       int ai, bi;       cin >> ai >> bi;       adj[ai].push_back(bi);       adj[bi].push_back(ai);     }     dfs(1, -1);     for (int i = (0); i < (m); i++) {       int vi, ki;       cin >> vi >> ki;       qr[i].l = sttime[vi];       qr[i].r = fntime[vi];       qr[i].k = ki;       qr[i].ind = i;     }     sort(qr, qr + m, mos_cmp);     int l = 0, r = -1;     for (int i = (0); i < (m); i++) {       while (l > qr[i].l) {         l--;         mos_add(st[l]);       }       while (r < qr[i].r) {         r++;         mos_add(st[r]);       }       while (l < qr[i].l) {         mos_rem(st[l]);         l++;       }       while (r > qr[i].r) {         mos_rem(st[r]);         r--;       }       ans[qr[i].ind] = bnd[qr[i].k];     }     for (int i = (0); i < (m); i++) {       cout << ans[i] <<   n ;     }     return 0;   }   