#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, m, ans[N], c[N];
bool mark[N];
vector<int> adj[N];
vector<pair<int, int> > q[N];
map<int, int> mp[N], f[N];
int query(int v, int m) {
  m = N - m;
  int res = 0;
  while (m) res += f[v][m], m -= m & -m;
  return res;
}
void update(int v, int m, int x) {
  m = N - m;
  while (m < N) f[v][m] += x, m += m & -m;
}
void answer(int v) {
  for (int i = 0; i < q[v].size(); i++)
    ans[q[v][i].second] = query(v, q[v][i].first);
}
void merge(int v, int u) {
  for (map<int, int>::iterator it = mp[u].begin(); it != mp[u].end(); it++) {
    update(v, mp[v][it->first], -1);
    mp[v][it->first] += it->second;
    update(v, mp[v][it->first], 1);
  }
}
void dfs(int v) {
  mark[v] = true;
  for (int i = 0; i < adj[v].size(); i++)
    if (!mark[adj[v][i]])
      dfs(adj[v][i]);
    else
      swap(adj[v][i], adj[v].back()), adj[v].pop_back(), i--;
  mp[v][c[v]] = 1, update(v, 1, 1);
  for (int i = 0; i < adj[v].size(); i++) {
    int u = adj[v][i];
    if (mp[u].size() > mp[v].size()) mp[u].swap(mp[v]), f[u].swap(f[v]);
    merge(v, u);
  }
  answer(v);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin >> n >> m;
  for (int i = 0; i < n; i++) cin >> c[i];
  for (int i = 0; i < n - 1; i++) {
    int u, v;
    cin >> u >> v;
    u--, v--;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  for (int i = 0; i < m; i++) {
    int v, k;
    cin >> v >> k;
    q[--v].push_back(pair<int, int>(k, i));
  }
  dfs(0);
  for (int i = 0; i < m; i++) cout << ans[i] << '\n';
  return 0;
}
