#include <bits/stdc++.h>
using namespace std;
const int maxN = 100 * 1000 + 5;
vector<int> adj[maxN];
int n;
vector<int> b[maxN];
map<int, int> t[maxN];
int pnt[maxN], sz[maxN], c[maxN];
int ans[maxN];
vector<pair<int, int> > que[maxN];
void join(int u, int v) {
  int uu = u, vv = v;
  u = pnt[u];
  v = pnt[v];
  if (sz[u] > sz[v]) swap(u, v), swap(uu, vv);
  for (__typeof(t[u].begin()) it = t[u].begin(); it != t[u].end(); it++) {
    int x = it->first, c = it->second;
    for (int i = 0; i < c; i++) {
      int y = ++t[v][x];
      if (y == ((int)(b[v]).size())) b[v].push_back(0);
      b[v][y]++;
    }
  }
  b[u].clear();
  t[u].clear();
  sz[v] += sz[u];
  pnt[uu] = v;
}
void dfs(int x, int p) {
  pnt[x] = x;
  b[x].push_back(0);
  b[x].push_back(1);
  t[x][c[x]]++;
  sz[x] = 1;
  for (int i = 0; i < ((int)(adj[x]).size()); i++) {
    int u = adj[x][i];
    if (u == p) continue;
    dfs(u, x);
    join(x, u);
  }
  for (int i = 0; i < ((int)(que[x]).size()); i++) {
    int k = que[x][i].first, ind = que[x][i].second;
    if (k < ((int)(b[pnt[x]]).size())) ans[ind] = b[pnt[x]][k];
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  int q;
  cin >> n >> q;
  for (int i = 0; i < n; i++) cin >> c[i], 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 < q; i++) {
    int v, k;
    cin >> v >> k;
    v--;
    que[v].push_back(make_pair(k, i));
  }
  dfs(0, -1);
  for (int i = 0; i < q; i++) cout << ans[i] << endl;
  return 0;
}
