#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int n, m, dfc, block, l, r;
int a[maxn], dfn[maxn], dfo[maxn], num[maxn], sum[maxn], res[maxn], b[maxn];
vector<int> G[maxn];
struct node {
  int l, r, pos, k;
  bool operator<(const node &s) const {
    return r / block == s.r / block ? l < s.l : r / block < s.r / block;
  }
} q[maxn];
void dfs(int u) {
  dfn[u] = ++dfc;
  for (int i = 0; i < G[u].size(); i++) {
    int v = G[u][i];
    if (!dfn[v]) dfs(v);
  }
  dfo[u] = dfc;
}
void add(int x) {
  num[x]++;
  sum[num[x]]++;
}
void del(int x) {
  sum[num[x]]--;
  num[x]--;
}
int main() {
  scanf("%d%d", &n, &m);
  block = sqrt(n);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  int u, v;
  for (int i = 1; i < n; i++) {
    scanf("%d%d", &u, &v);
    G[u].push_back(v);
    G[v].push_back(u);
  }
  dfs(1);
  for (int i = 1; i <= n; i++) b[dfn[i]] = a[i];
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &u, &q[i].k);
    q[i].l = dfn[u], q[i].r = dfo[u], q[i].pos = i;
  }
  sort(q + 1, q + m + 1);
  l = q[1].l, r = q[1].r;
  for (int i = l; i <= r; i++) add(b[i]);
  res[q[1].pos] = sum[q[1].k];
  for (int i = 2; i <= m; i++) {
    while (l > q[i].l) add(b[--l]);
    while (r < q[i].r) add(b[++r]);
    while (l < q[i].l) del(b[l++]);
    while (r > q[i].r) del(b[r--]);
    res[q[i].pos] = sum[q[i].k];
  }
  for (int i = 1; i <= m; i++) printf("%d\n", res[i]);
  return 0;
}
