#include <bits/stdc++.h>
int rd() {
  int k = 0;
  char c = getchar();
  while (c > '9' || c < '0') c = getchar();
  while (c >= '0' && c <= '9') k = k * 10 + c - '0', c = getchar();
  return k;
}
const int N = 100001;
struct E {
  int v, nxt;
} e[N << 1];
struct Q {
  int k, w, nxt;
} q[N];
int n, m, h[N], qh[N], cnt, a[N], u, v, ans[N], d[N], s[N], f[N], sz[N], son[N];
bool vis[N];
void add(int u, int v) { e[++cnt].v = v, e[cnt].nxt = h[u], h[u] = cnt; }
void Add(int u, int k, int w) { q[++cnt] = (Q){k, w, qh[u]}, qh[u] = cnt; }
void dfs1(int u, int fa) {
  sz[u] = 1, f[u] = fa;
  for (int i = h[u]; i; i = e[i].nxt) {
    int v = e[i].v;
    if (v == fa) continue;
    dfs1(v, u), sz[u] += sz[v];
    if (sz[son[u]] < sz[v]) son[u] = v;
  }
}
void Update(int u, int k) {
  if (k > 0)
    ++d[++s[a[u]]];
  else
    --d[s[a[u]]--];
  for (int i = h[u]; i; i = e[i].nxt) {
    int v = e[i].v;
    if (v != f[u] && !vis[v]) Update(v, k);
  }
}
void dfs2(int u, bool k) {
  for (int i = h[u]; i; i = e[i].nxt) {
    int v = e[i].v;
    if (v != f[u] && v != son[u]) dfs2(v, 0);
  }
  if (son[u]) dfs2(son[u], 1), vis[son[u]] = 1;
  Update(u, 1);
  for (int i = qh[u]; i; i = q[i].nxt) ans[q[i].w] = d[q[i].k];
  vis[son[u]] = 0;
  if (!k) Update(u, -1);
}
int main() {
  n = rd(), m = rd();
  for (int i = 1; i <= n; ++i) a[i] = rd();
  for (int i = 1; i < n; ++i) u = rd(), v = rd(), add(u, v), add(v, u);
  dfs1(1, 0), cnt = 0;
  for (int i = 1; i <= m; ++i) u = rd(), Add(u, rd(), i);
  dfs2(1, 1);
  for (int i = 1; i <= m; ++i) printf("%d\n", ans[i]);
  return 0;
}
