#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5;
int n, m, upd, c[MAXN + 5], t[MAXN + 5], has[MAXN + 5], cnt[MAXN + 5],
    ans[MAXN + 5];
vector<pair<int, int> > adj[MAXN + 5];
vector<pair<int, int> > q[MAXN + 5];
void dfsw(int v, int par) {
  for (int i = 0; i < ((int)((adj[v]).size())); i++)
    if (adj[v][i].second != par) {
      int u = adj[v][i].second;
      dfsw(u, v);
      adj[v][i].first = t[u];
      t[v] += t[u];
    }
  sort(adj[v].begin(), adj[v].end());
}
void dfsadd(int v) {
  has[++cnt[c[v]]]++;
  for (int i = 1; i < ((int)((adj[v]).size())); i++) dfsadd(adj[v][i].second);
}
void dfsrem(int v) {
  has[cnt[c[v]]]--, cnt[c[v]]--;
  for (int i = 1; i < ((int)((adj[v]).size())); i++) dfsrem(adj[v][i].second);
}
void dfsans(int v) {
  for (int i = 1; i < ((int)((adj[v]).size())) - 1; i++) {
    dfsans(adj[v][i].second);
    dfsrem(adj[v][i].second);
  }
  if (((int)((adj[v]).size())) > 1) dfsans(adj[v].back().second);
  has[++cnt[c[v]]]++;
  for (int i = 1; i < ((int)((adj[v]).size())) - 1; i++)
    dfsadd(adj[v][i].second);
  for (int i = 0; i < ((int)((q[v]).size())); i++)
    ans[q[v][i].second] = has[q[v][i].first];
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  for (int i = 0; i < n; i++) cin >> c[i], c[i]--, t[i]++;
  adj[0].push_back(make_pair(0, -1));
  for (int i = 0, v, u; i < n - 1; i++) {
    cin >> v >> u, v--, u--;
    adj[v].push_back(make_pair(0, u));
    adj[u].push_back(make_pair(0, v));
  }
  for (int i = 0, v, k; i < m; i++) {
    cin >> v >> k, v--;
    q[v].push_back(make_pair(k, i));
  }
  dfsw(0, -1);
  dfsans(0);
  for (int i = 0; i < m; i++) cout << ans[i] << "\n";
  return 0;
}
