#include <bits/stdc++.h>
using namespace std;
struct fenwickTree {
  long long n;
  vector<long long> bit;
  fenwickTree() {}
  fenwickTree(long long siz) : n(siz + 5), bit(siz + 5, 0) {}
  void add(long long pos, long long upd) {
    for (; pos < n; pos += pos & (-pos)) bit[pos] += upd;
  }
  long long sum(long long pos) {
    long long ret = 0;
    for (; pos; pos -= pos & (-pos)) ret += bit[pos];
    return ret;
  }
  long long query(long long pos) {
    return sum(n - 1) - sum(min(n - 1, pos - 1));
  }
};
const long long nax = 100005;
long long c[nax], ss[nax] = {0}, dsu[nax], siz[nax] = {0}, ans[nax];
vector<long long> g[nax];
vector<pair<long long, long long>> q[nax];
vector<map<long long, long long>> mp(nax);
vector<fenwickTree> bitarr(nax);
void dfs(long long u, long long p) {
  ss[u] = siz[u] = 1;
  long long mx = -1, mxc = -1;
  for (auto &k : g[u])
    if (k != p) {
      dfs(k, u);
      ss[u] += ss[k];
      if (ss[k] > mx) mx = ss[k], mxc = k;
    }
  if (mxc != -1) {
    dsu[u] = dsu[mxc];
    siz[dsu[mxc]] = ss[u];
  }
}
void add(long long u, long long col, long long cnt) {
  if (!cnt) return;
  if (mp[u].count(col)) bitarr[u].add(mp[u][col], -1);
  mp[u][col] += cnt;
  bitarr[u].add(mp[u][col], 1);
}
void dfs2(long long u, long long p) {
  for (auto &k : g[u])
    if (k != p) dfs2(k, u);
  add(dsu[u], c[u], 1);
  for (auto &k : g[u])
    if (k != p && dsu[k] != dsu[u])
      for (auto &col : mp[dsu[k]]) add(dsu[u], col.first, col.second);
  for (auto &qry : q[u]) ans[qry.first] = bitarr[dsu[u]].query(qry.second);
}
int32_t main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  long long n, m;
  cin >> n >> m;
  for (long long i = 1; i <= n; i++) dsu[i] = i;
  for (long long i = 1; i <= n; i++) cin >> c[i];
  for (long long i = 0; i < n - 1; i++) {
    long long u, v;
    cin >> u >> v;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  dfs(1, 1);
  for (long long i = 1; i <= n; i++) bitarr[i] = fenwickTree(siz[i]);
  for (long long i = 0; i < m; i++) {
    long long a, b;
    cin >> a >> b;
    q[a].push_back({i + 1, b});
  }
  dfs2(1, 1);
  for (long long i = 1; i <= m; i++) cout << ans[i] << '\n';
}
