#include <bits/stdc++.h>
using namespace std;
const long long M = 1e15 + 7, maxn = 1e5 + 50;
int ans, n, m, x, y, q, w, k, cnt[maxn], a[maxn], tedad[maxn], s[maxn], f[maxn],
    st, block = 400;
std::vector<int> adj[maxn];
vector<pair<pair<int, int>, pair<int, int> > > query;
std::vector<int> tim;
int stsort[maxn];
int ansv[maxn];
void dfs(int v, int p) {
  s[v] = st;
  stsort[st] = a[v];
  for (int i : adj[v]) {
    if (i != p) {
      st++;
      dfs(i, v);
    }
  }
  f[v] = st;
}
int32_t main() {
  scanf("%d%d", &n, &q);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (int i = 1; i < n; ++i) {
    scanf("%d%d", &x, &y);
    adj[x].push_back(y);
    adj[y].push_back(x);
  }
  dfs(1, 0);
  pair<pair<int, int>, int> QUERY[q];
  for (int i = 0; i < q; i++) {
    scanf("%d%d", &x, &y);
    query.push_back(
        {{s[x] / block, ((s[x] / block) & 1) ? -f[x] : +f[x]}, {y, i}});
    QUERY[i] = {{s[x], f[x]}, y};
  }
  sort((query).begin(), (query).end());
  int L = 0, R = 0;
  cnt[a[1]]++;
  tedad[1]++;
  for (int i = 0; i < q; i++) {
    int l = QUERY[query[i].second.second].first.first,
        r = QUERY[query[i].second.second].first.second;
    while (l < L) {
      L--;
      cnt[stsort[L]]++;
      tedad[cnt[stsort[L]]]++;
    }
    while (r < R) {
      tedad[cnt[stsort[R]]]--;
      cnt[stsort[R]]--;
      R--;
    }
    while (r > R) {
      R++;
      cnt[stsort[R]]++;
      tedad[cnt[stsort[R]]]++;
    }
    while (l > L) {
      tedad[cnt[stsort[L]]]--;
      cnt[stsort[L]]--;
      L++;
    }
    ansv[query[i].second.second] = tedad[query[i].second.first];
  }
  for (int i = 0; i < q; i++) printf("%d\n", ansv[i]);
  ;
  return 0;
}
