#include <bits/stdc++.h>
using namespace std;
int n, m;
vector<int> e[200005];
int l[200005], r[200005];
int c[200005], d[200005];
int bel[200005], cnt[200005], v[200005], ans[200005];
struct Q {
  int l, r, k, id;
  Q(int _l = 0, int _r = 0, int _k = 0, int _id = 0) {
    l = _l, r = _r, k = _k, id = _id;
  }
} q[200005];
int dfn;
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch > '9' || ch < '0') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x * f;
}
inline void write(int x) {
  if (x < 0) {
    putchar('-');
    x = -x;
  }
  if (x >= 10) write(x / 10);
  putchar(x % 10 + '0');
}
void dfs(int u, int fa) {
  l[u] = ++dfn, d[dfn] = c[u];
  for (int i = 0; i < e[u].size(); i++) {
    int v = e[u][i];
    if (v == fa) continue;
    dfs(v, u);
  }
  r[u] = dfn;
}
inline bool cmp(Q s, Q t) {
  if (bel[s.l] != bel[t.l]) return bel[s.l] < bel[t.l];
  return s.r < t.r;
}
inline void add(int i) { ++v[d[i]], ++cnt[v[d[i]]]; }
inline void del(int i) { --cnt[v[d[i]]], --v[d[i]]; }
inline void addEdge(int u, int v) { e[u].push_back(v); }
int main() {
  n = read(), m = read();
  for (int i = 1; i <= n; i++) c[i] = read();
  int size = (int)sqrt(n);
  for (int i = 1; i <= n; i++) bel[i] = (i - 1) / size + 1;
  for (int i = 1, u, v; i < n; i++)
    u = read(), v = read(), addEdge(u, v), addEdge(v, u);
  dfs(1, 0);
  for (int i = 1, x, k; i <= m; i++)
    x = read(), k = read(), q[i] = Q(l[x], r[x], k, i);
  sort(q + 1, q + m + 1, cmp);
  int l = 1, r = 0;
  for (int 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].id] = cnt[q[i].k];
  }
  for (int i = 1; i <= m; i++) printf("%d\n", ans[i]);
  return 0;
}
