#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 9;
int sum[N], ans[N], pos[N];
int l, r, nl, nr, n, m, k, ct, len;
int u, v, cnt, head[N], c;
struct dfn {
  int l, r, val;
} p[N];
struct node {
  int l, r, k, id, bl;
} q[N];
struct edge {
  int v, nxt;
} e[N << 1];
inline int read() {
  int c = getchar(), t = 1, n = 0;
  while (isspace(c)) {
    c = getchar();
  }
  if (c == '-') {
    t = -1, c = getchar();
  }
  while (isdigit(c)) {
    n = n * 10 + c - '0', c = getchar();
  }
  return n * t;
}
inline void add_edge(int u, int v) {
  e[++cnt] = {v, head[u]};
  head[u] = cnt;
}
inline void dfs(int nw) {
  p[nw].l = ++ct;
  for (int i = head[nw]; i != 0; i = e[i].nxt) {
    int v = e[i].v;
    if (p[v].l == 0) dfs(v);
  }
  p[nw].r = ct;
}
bool cmp(node u, node v) {
  if (u.bl != v.bl)
    return u.bl < v.bl;
  else {
    if (u.bl & 1)
      return u.r < v.r;
    else
      return u.r > v.r;
  }
}
bool cmp1(dfn u, dfn v) { return u.l < v.l; }
inline void init() {
  len = pow(n, 0.55);
  for (int i = 1; i <= m; i++) {
    u = read();
    c = read();
    q[i].l = p[u].l;
    q[i].r = p[u].r;
    q[i].k = c;
    q[i].id = i;
    q[i].bl = (q[i].l - 1) / len + 1;
  }
  sort(q + 1, q + m + 1, cmp);
  sort(p + 1, p + n + 1, cmp1);
}
inline void del(int x) {
  --pos[sum[p[x].val]];
  --sum[p[x].val];
}
inline void add(int x) {
  ++sum[p[x].val];
  ++pos[sum[p[x].val]];
}
inline void solve() {
  l = 1;
  r = 0;
  for (int i = 1; i <= m; i++) {
    nl = q[i].l;
    nr = q[i].r;
    while (l < nl) del(l++);
    while (l > nl) add(--l);
    while (r > nr) del(r--);
    while (r < nr) add(++r);
    ans[q[i].id] = pos[q[i].k];
  }
}
int main() {
  n = read();
  m = read();
  for (int i = 1; i <= n; i++) p[i].val = read();
  for (int i = 1; i <= n - 1; i++) {
    u = read();
    v = read();
    add_edge(u, v);
    add_edge(v, u);
  }
  dfs(1);
  init();
  solve();
  for (int i = 1; i <= m; i++) {
    printf("%d\n", ans[i]);
  }
  return 0;
}
