#include <bits/stdc++.h>
using namespace std;
int const maxn = 1e5 + 20;
int n, q, c[maxn], x[maxn], y[maxn], ans[maxn];
vector<int> mmap[maxn], vec[maxn];
map<int, int> mp[maxn], cnt[maxn];
void dfs(int now, int last = -1) {
  mp[now][c[now]] = 1;
  cnt[now][1] = 1;
  for (auto u : mmap[now]) {
    if (u == last) continue;
    dfs(u, now);
    if (mp[u].size() > mp[now].size())
      mp[u].swap(mp[now]), cnt[u].swap(cnt[now]);
    map<int, int>::iterator it;
    for (it = mp[u].begin(); it != mp[u].end(); ++it) {
      int tanao = it->first;
      while (mp[u][tanao]--) {
        ++mp[now][tanao];
        ++cnt[now][mp[now][tanao]];
      }
    }
  }
  for (auto QwQ : vec[now]) ans[QwQ] = cnt[now][y[QwQ]];
}
int main() {
  scanf("%d%d", &n, &q);
  for (int i = 0; i < n; i++) scanf("%d", &c[i]);
  int u, v;
  for (int i = 0; i < n - 1; i++) {
    scanf("%d%d", &u, &v);
    --u, --v;
    mmap[u].push_back(v);
    mmap[v].push_back(u);
  }
  for (int i = 0; i < q; i++) {
    scanf("%d%d", &x[i], &y[i]);
    --x[i];
    vec[x[i]].push_back(i);
  }
  dfs(0);
  for (int i = 0; i < q; i++) printf("%d\n", ans[i]);
  return 0;
}
