#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, m, a[N], b[N], L[N], R[N], dfn_tot;
int cnt[N], hav[N];
int head[N << 1], tot, bl[N];
struct Node {
  int s, t, k, id, ans;
} Q[N];
bool cmp1(Node a, Node b) { return bl[a.s] == bl[b.s] ? a.t < b.t : a.s < b.s; }
bool cmp2(Node a, Node b) { return a.id < b.id; }
struct Edge {
  int v, nxt;
} e[N << 1];
void add(int u, int v) {
  e[++tot] = {v, head[u]};
  head[u] = tot;
}
void dfs(int u, int fa) {
  b[++dfn_tot] = u;
  L[u] = dfn_tot;
  for (int i = head[u]; i; i = e[i].nxt) {
    int v = e[i].v;
    if (v == fa) continue;
    dfs(v, u);
  }
  R[u] = dfn_tot;
}
int main() {
  scanf("%d%d", &n, &m);
  int blo = sqrt(n);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (int i = 1; i <= n; i++) bl[i] = (i - 1) / blo + 1;
  for (int i = 1; i <= n - 1; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    add(x, y);
    add(y, x);
  }
  dfs(1, 0);
  for (int i = 1; i <= m; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    Q[i].s = L[x];
    Q[i].t = R[x];
    Q[i].k = y;
    Q[i].id = i;
  }
  sort(Q + 1, Q + 1 + m, cmp1);
  int l = 1, r = 0;
  for (int i = 1; i <= m; i++) {
    while (l > Q[i].s) hav[a[b[--l]]]++, cnt[hav[a[b[l]]]]++;
    while (l < Q[i].s) cnt[hav[a[b[l]]]]--, hav[a[b[l++]]]--;
    while (r < Q[i].t) hav[a[b[++r]]]++, cnt[hav[a[b[r]]]]++;
    while (r > Q[i].t) cnt[hav[a[b[r]]]]--, hav[a[b[r--]]]--;
    Q[i].ans = cnt[Q[i].k];
  }
  sort(Q + 1, Q + 1 + m, cmp2);
  for (int i = 1; i <= m; i++) printf("%d\n", Q[i].ans);
  return 0;
}
