#include <bits/stdc++.h>
using namespace std;
vector<int> con[100010];
int dap[100010], x, y, a[100010], st[100010], en[100010], cnt, n, m,
    arr[100010], c, ch[100010], num[100010];
struct data {
  int s, e, y, pos;
  bool operator<(const data& r) const {
    if ((s - 1) / c == (r.s - 1) / c) return e < r.e;
    return ((s - 1) / c) < ((r.s - 1) / c);
  }
} q[100010];
void dfs(int x, int bef) {
  int i;
  st[x] = ++cnt;
  arr[cnt] = a[x];
  for (i = 0; i < con[x].size(); i++) {
    if (con[x][i] == bef) continue;
    dfs(con[x][i], x);
  }
  en[x] = cnt;
}
int main() {
  int i, j, s = 0, e = 0;
  scanf("%d %d", &n, &m);
  for (i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (i = 1; i <= n - 1; i++) {
    scanf("%d %d", &x, &y);
    con[x].push_back(y);
    con[y].push_back(x);
  }
  dfs(1, 0);
  c = sqrt(n);
  for (i = 1; i <= m; i++) {
    scanf("%d %d", &x, &y);
    q[i].s = st[x];
    q[i].e = en[x];
    q[i].y = y;
    q[i].pos = i;
  }
  sort(q + 1, q + m + 1);
  for (i = 1; i <= m; i++) {
    if (s != (q[i].s - 1) / c) {
      s = (q[i].s - 1) / c, cnt = 0;
      e = c * s;
      for (j = 1; j <= 100000; j++) ch[j] = num[j] = 0;
    }
    for (j = e + 1; j <= q[i].e; j++) {
      ch[arr[j]]++;
      num[ch[arr[j]]]++;
    }
    for (j = c * s + 1; j < q[i].s; j++) {
      num[ch[arr[j]]]--;
      ch[arr[j]]--;
    }
    dap[q[i].pos] = num[q[i].y];
    for (j = c * s + 1; j < q[i].s; j++) {
      ch[arr[j]]++;
      num[ch[arr[j]]]++;
    }
    e = q[i].e;
  }
  for (i = 1; i <= m; i++) printf("%d\n", dap[i]);
  return 0;
}
