#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 100, SQ = 317;
int aa[N], ans[N], ln[N], rn[N], cnt = 0, fen[N], t[N], l, r, nod[N], k[N],
                                 a[N];
vector<int> v[N];
pair<pair<pair<int, int>, int>, int> p[N];
void upd(int x, int val) {
  if (x <= 0) return;
  for (; x <= N - 3; x += (x & (-x))) fen[x] += val;
}
int que(int x) {
  if (x <= 0) return 0;
  int ret = 0;
  for (; x >= 1; x -= (x & (-x))) ret += fen[x];
  return ret;
}
int query(int l, int r) { return que(r) - que(l - 1); }
void rr() {
  upd(t[a[r]], -1);
  t[a[r]]++;
  upd(t[a[r]], 1);
  r++;
}
void rl() {
  r--;
  upd(t[a[r]], -1);
  t[a[r]]--;
  upd(t[a[r]], 1);
}
void lr() {
  upd(t[a[l]], -1);
  t[a[l]]--;
  upd(t[a[l]], 1);
  l++;
}
void ll() {
  l--;
  upd(t[a[l]], -1);
  t[a[l]]++;
  upd(t[a[l]], 1);
}
void dfs(int x = 0, int px = -1) {
  aa[cnt] = a[x];
  ln[x] = cnt++;
  for (int u : v[x]) {
    if (u != px) {
      dfs(u, x);
    }
  }
  rn[x] = cnt;
}
bool cmp(pair<pair<pair<int, int>, int>, int> p1,
         pair<pair<pair<int, int>, int>, int> p2) {
  int l1 = p1.first.first.first, l2 = p2.first.first.first;
  int r1 = p1.first.first.second, r2 = p2.first.first.second;
  if (l1 / SQ != l2 / SQ) {
    return l1 / SQ < l2 / SQ;
  }
  return r1 < r2;
}
int main() {
  ios::sync_with_stdio(0);
  int n, q;
  cin >> n >> q;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  for (int i = 0, u1, u2; i < n - 1; i++) {
    cin >> u1 >> u2;
    u1--;
    u2--;
    v[u1].emplace_back(u2);
    v[u2].emplace_back(u1);
  }
  dfs();
  for (int i = 0; i < n; i++) {
    a[i] = aa[i];
  }
  for (int i = 0; i < q; i++) {
    cin >> nod[i] >> k[i];
    nod[i]--;
    p[i] = make_pair(make_pair(make_pair(ln[nod[i]], rn[nod[i]]), k[i]), i);
  }
  sort(p, p + q, cmp);
  for (int i = 0; i < q; i++) {
    int lq = p[i].first.first.first, rq = p[i].first.first.second;
    while (lq != l || rq != r) {
      if (rq > r) {
        rr();
      } else if (lq < l) {
        ll();
      } else if (lq > l) {
        lr();
      } else if (rq < r) {
        rl();
      }
    }
    ans[p[i].second] = query(p[i].first.second, N - 10);
  }
  for (int i = 0; i < q; i++) {
    cout << ans[i] << '\n';
  }
}
