func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 1e5 + 10;   vector<int> G[N];   vector<pair<int, pair<int, int> > > query;   int color[N], Ecolor[2 * N], f[N], s[2 * N], start[N], finish[N], ans[N];   int n, m, u, v, cnt;   int block_size;   void dfs(int u) {     start[u] = ++cnt;     Ecolor[cnt] = color[u];     for (int i = 0; i < G[u].size(); ++i) {       int v = G[u][i];       if (!start[v]) dfs(v);     }     finish[u] = ++cnt;     Ecolor[cnt] = color[u];   }   bool mo_cmp(pair<int, pair<int, int> > p, pair<int, pair<int, int> > q) {     u = p.second.first, v = q.second.first;     if (start[u] / block_size == start[v] / block_size)       return finish[u] < finish[v];     return start[u] / block_size < start[v] / block_size;   }   void add(int pos) {     f[Ecolor[pos]]++;     s[f[Ecolor[pos]]]++;   }   void rem(int pos) {     s[f[Ecolor[pos]]]--;     f[Ecolor[pos]]--;   }   int main() {     ios::sync_with_stdio(false);     cin >> n >> m;     block_size = sqrt(n);     for (int i = 1; i <= n; ++i) cin >> color[i];     for (int i = 1; i < n; ++i) {       cin >> u >> v;       G[u].push_back(v);       G[v].push_back(u);     }     dfs(1);     for (int i = 0; i < m; ++i) {       cin >> u >> v;       query.push_back(pair<int, pair<int, int> >(i, pair<int, int>(u, v)));     }     sort(query.begin(), query.end(), mo_cmp);     int curL = 1, curR = 1;     add(1);     for (int i = 0; i < query.size(); ++i) {       int p = query[i].second.first;       while (curL < start[p]) {         rem(curL);         curL++;       }       while (curL > start[p]) {         curL--;         add(curL);       }       while (curR < finish[p]) {         curR++;         add(curR);       }       while (curR > finish[p]) {         rem(curR);         curR--;       }       ans[query[i].first] = s[query[i].second.second * 2];     }     for (int i = 0; i < m; ++i) cout << ans[i] <<   n ;   }   