#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
struct node1 {
  int L, R, num, k;
} Q[N];
struct node2 {
  int to, nxt;
} edge[N << 1];
struct node3 {
  int a, DFN1, DFN2;
} val[N];
int head[N], cnt[N], ans[N], Ans[N], ecnt = 0, DFN = 0, block, n, m, l = 1,
                                     r = 0;
inline bool cmp1(node1 a, node1 b) {
  return (a.L / block) ^ (b.L / block)
             ? a.L < b.L
             : (((a.L / block) & 1) ? a.R < b.R : a.R > b.R);
}
inline bool cmp2(node3 a, node3 b) { return a.DFN1 < b.DFN1; }
inline void Addedge(int x, int y) {
  edge[++ecnt].to = y, edge[ecnt].nxt = head[x], head[x] = ecnt;
  edge[++ecnt].to = x, edge[ecnt].nxt = head[y], head[y] = ecnt;
}
inline void Add(int x) { ++cnt[x], ++ans[cnt[x]]; }
inline void Del(int x) { --ans[cnt[x]], --cnt[x]; }
inline void dfs(int x) {
  val[x].DFN1 = ++DFN;
  for (register int i = head[x]; i; i = edge[i].nxt)
    if (!val[edge[i].to].DFN1) dfs(edge[i].to);
  val[x].DFN2 = DFN;
}
int main() {
  scanf("%d%d", &n, &m);
  for (register int i = 1; i <= n; ++i) scanf("%d", &val[i].a);
  for (register int i = 1, x, y; i < n; ++i) {
    scanf("%d%d", &x, &y);
    Addedge(x, y);
  }
  dfs(1);
  block = sqrt(n);
  for (register int i = 1, x, k; i <= m; ++i) {
    scanf("%d%d", &x, &k);
    Q[i].L = val[x].DFN1, Q[i].R = val[x].DFN2, Q[i].k = k, Q[i].num = i;
  }
  sort(Q + 1, Q + m + 1, cmp1);
  sort(val + 1, val + n + 1, cmp2);
  for (register int i = 1; i <= m; ++i) {
    int ql = Q[i].L, qr = Q[i].R;
    while (l < ql) Del(val[l++].a);
    while (l > ql) Add(val[--l].a);
    while (r < qr) Add(val[++r].a);
    while (r > qr) Del(val[r--].a);
    Ans[Q[i].num] = ans[Q[i].k];
  }
  for (register int i = 1; i <= m; ++i) printf("%d\n", Ans[i]);
  return 0;
}
