func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 100005;   struct Query {     int idx, k;   };   int n, m;   int c[N], ans[N], cnt[N], pref[N];   vector<Query> qs[N];   vector<int> adj[N];   void read() {     cin >> n >> m;     for (int i = 1; i <= n; i++) cin >> c[i];     for (int i = 1; i <= n - 1; i++) {       int u, v;       cin >> u >> v;       adj[u].push_back(v);       adj[v].push_back(u);     }     for (int i = 1; i <= m; i++) {       int v, k;       cin >> v >> k;       qs[v].push_back({i, k});     }   }   int idx = 0;   int fs[N], ed[N], euler[N], sz[N];   void findSz(int u, int p) {     sz[u] = 1;     fs[u] = ++idx;     euler[idx] = u;     for (auto& v : adj[u]) {       if (v != p) {         findSz(v, u);         sz[u] += sz[v];       }     }     ed[u] = idx;   }   void dfs(int u, int p, bool keep) {     int mx = -1, bigChild = -1;     for (auto& v : adj[u]) {       if (v != p && mx < sz[v]) mx = sz[v], bigChild = v;     }     for (auto& v : adj[u]) {       if (v != p && v != bigChild) dfs(v, u, 0);     }     if (bigChild != -1) dfs(bigChild, u, 1);     for (auto& v : adj[u]) {       if (v != p && v != bigChild) {         for (int i = fs[v]; i <= ed[v]; i++) {           pref[cnt[c[euler[i]]]]--;           cnt[c[euler[i]]]++;         }       }     }     pref[cnt[c[u]]]--;     cnt[c[u]]++;     for (auto& q : qs[u]) ans[q.idx] = N - pref[q.k - 1];     if (!keep) {       for (int i = fs[u]; i <= ed[u]; i++) {         cnt[c[euler[i]]]--;         pref[cnt[c[euler[i]]]]++;       }     }   }   void solve() {     findSz(1, 0);     memset(cnt, 0, sizeof cnt);     for (int i = 0; i < N; i++) pref[i] = N;     dfs(1, 0, 1);     for (int i = 1; i <= m; i++) cout << ans[i] <<   n ;   }   int main() {     ios::sync_with_stdio(false);     cin.tie(NULL);     cout.tie(NULL);     read();     solve();     return 0;   }   