#include <bits/stdc++.h>
using namespace std;
namespace mstd {
inline void qread(int &x) {
  x = 0;
  int f = 1;
  static char c = getchar();
  while (!isdigit(c)) {
    if (c == '-') f = -f;
    c = getchar();
  }
  while (isdigit(c)) x = (x * 10 + c - '0'), c = getchar();
  x *= f;
}
inline void qread(long long &x) {
  x = 0;
  long long f = 1;
  static char c = getchar();
  while (!isdigit(c)) {
    if (c == '-') f = -f;
    c = getchar();
  }
  while (isdigit(c)) x = (x * 10 + c - '0'), c = getchar();
  x *= f;
}
}  // namespace mstd
const int maxn = 100100;
int f[maxn], n, m;
int size, head[maxn], sz[maxn];
int c[maxn], looker[maxn], tv[maxn], cnt, bl[maxn];
int ans[maxn], a[maxn], len;
int vt[maxn];
struct edge {
  int next, to;
} e[maxn << 1];
inline void addedge(int next, int to) {
  e[++size].to = to;
  e[size].next = head[next];
  head[next] = size;
}
void dfs1(int t, int fat) {
  int i, j;
  sz[t] = 1;
  f[t] = fat;
  tv[t] = ++cnt;
  vt[cnt] = t;
  for (i = head[t]; i; i = e[i].next) {
    j = e[i].to;
    if (j == fat) continue;
    dfs1(j, t);
    sz[t] += sz[j];
  }
}
struct que {
  int l, r, k, bh;
  bool operator<(const que &ano) const {
    if (bl[l] == bl[ano.l])
      return (bl[l] & 1 ? 1 : -1) * r < (bl[l] & 1 ? 1 : -1) * ano.r;
    else
      return bl[l] < bl[ano.l];
  }
} q[maxn];
inline void prework() {
  int i, j;
  for (i = 1; i <= m; i++)
    q[i].r = tv[q[i].l] + sz[q[i].l] - 1, q[i].l = tv[q[i].l];
  len = max(10, (int)sqrt(n));
  for (i = 1; i <= m; i++) bl[i] = (i - 1) / len + 1;
  sort(q + 1, q + m + 1);
}
inline void add(const int x) {
  c[a[vt[x]]]++;
  looker[c[a[vt[x]]]]++;
  return;
}
inline void del(const int x) {
  looker[c[a[vt[x]]]]--;
  c[a[vt[x]]]--;
  return;
}
int main() {
  int i, j;
  mstd::qread(n);
  mstd::qread(m);
  for (i = 1; i <= n; i++) mstd::qread(a[i]);
  int t1, t2;
  for (i = 1; i < n; i++)
    mstd::qread(t1), mstd::qread(t2), addedge(t1, t2), addedge(t2, t1);
  dfs1(1, 1);
  for (i = 1; i <= m; i++)
    mstd::qread(q[i].l), mstd::qread(q[i].k), q[i].bh = i;
  prework();
  int l = 1, r = 0;
  for (i = 1; i <= m; i++) {
    while (l < q[i].l) del(l++);
    while (l > q[i].l) add(--l);
    while (r < q[i].r) add(++r);
    while (r > q[i].r) del(r--);
    ans[q[i].bh] = looker[q[i].k];
  }
  for (i = 1; i <= m; i++) printf("%d\n", ans[i]);
  return 0;
}
