#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10, pack = 320;
vector<pair<pair<long long, long long>, pair<long long, long long> > >
    SQRT[pack];
long long n, q, ans[N], col[N], stcnt, maxipack, cntap[N], cntcol[N];
vector<int> adj[N], a;
pair<long long, long long> SF[N];
void DFS(int v, int par) {
  SF[v].first = stcnt++;
  a.push_back(col[v]);
  for (int i = 0; i < adj[v].size(); i++) {
    int u = adj[v][i];
    if (u == par) continue;
    DFS(u, v);
  }
  SF[v].second = stcnt - 1;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> q;
  for (int i = 1; i <= n; i++) cin >> col[i];
  for (int i = 1; i < n; i++) {
    int x, y;
    cin >> x >> y;
    adj[x].push_back(y);
    adj[y].push_back(x);
  }
  DFS(1, 1);
  for (int i = 0; i < q; i++) {
    long long v, l, r, k;
    cin >> v >> k;
    r = SF[v].second, l = SF[v].first;
    SQRT[l / pack].push_back(make_pair(make_pair(r, l), make_pair(k, i)));
    maxipack = max(maxipack, l / pack);
  }
  for (int i = 0; i <= maxipack; i++) {
    if (!SQRT[i].size()) continue;
    sort(SQRT[i].begin(), SQRT[i].end());
    memset(cntcol, 0, sizeof cntcol);
    memset(cntap, 0, sizeof cntap);
    long long pos1 = SQRT[i][0].first.second, pos2 = SQRT[i][0].first.second;
    cntcol[a[pos1]]++;
    cntap[1]++;
    for (int j = 0; j < SQRT[i].size(); j++) {
      int x = pos1, y = SQRT[i][j].first.second, sign = 1;
      if (x < y) sign = -1;
      if (y < x) swap(x, y);
      while (x != y) {
        cntcol[a[x]] += sign;
        if (sign == -1)
          cntap[cntcol[a[x]] + 1]--;
        else
          cntap[cntcol[a[x]]]++;
        x++;
      }
      pos1 = SQRT[i][j].first.second;
      while (pos2 != SQRT[i][j].first.first) {
        pos2++;
        cntcol[a[pos2]]++;
        cntap[cntcol[a[pos2]]]++;
      }
      ans[SQRT[i][j].second.second] = cntap[SQRT[i][j].second.first];
    }
  }
  for (int i = 0; i < q; i++) cout << ans[i] << endl;
}
