#include <bits/stdc++.h>
using namespace std;
int block[(int)1e5 + 5], a[(int)1e5 + 5], Freq[(int)1e5 + 5], n, q;
int res[(int)1e5 + 5], tin[(int)1e5 + 5], tout[(int)1e5 + 5], timer,
    ans[(int)1e5 + 5];
vector<int> g[(int)1e5 + 5];
int tour[(int)1e5 + 5];
struct Query {
  int l, r, f, id;
} Q[(int)1e5 + 5];
inline bool comp(Query a, Query b) {
  return make_pair(block[a.l], block[a.r]) < make_pair(block[b.l], block[b.r]);
}
inline void flip(int x, bool add) {
  if (add)
    Freq[a[x]]++, ans[Freq[a[x]]]++;
  else
    ans[Freq[a[x]]]--, Freq[a[x]]--;
}
inline void dfs(int c, int p) {
  tin[c] = ++timer;
  tour[timer] = c;
  for (auto x : g[c])
    if (x != p) dfs(x, c);
  tout[c] = timer;
}
int main() {
  scanf("%d", &n);
  ;
  scanf("%d", &q);
  ;
  for (int x = 1; x <= n; x++) block[x] = x / 333;
  for (int x = 1; x <= n; x++) scanf("%d", &a[x]);
  ;
  for (int x = 1; x < n; x++) {
    int u, v;
    scanf("%d", &u);
    ;
    scanf("%d", &v);
    ;
    g[u].emplace_back(v);
    g[v].emplace_back(u);
  }
  dfs(1, 1);
  for (int x = 0; x < q; x++) {
    int v, f;
    scanf("%d", &v);
    ;
    scanf("%d", &f);
    ;
    Q[x].l = tin[v];
    Q[x].r = tout[v];
    Q[x].f = f;
    Q[x].id = x;
  }
  sort(Q, Q + q, comp);
  int L = 1, R = 0;
  for (int x = 0; x < q; x++) {
    while (L < Q[x].l) flip(tour[L++], false);
    while (L > Q[x].l) flip(tour[--L], true);
    while (R < Q[x].r) flip(tour[++R], true);
    while (R > Q[x].r) flip(tour[R--], false);
    res[Q[x].id] = ans[Q[x].f];
  }
  for (int x = 0; x < q; x++) printf("%d\n", res[x]);
}
