#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, m, mxcol;
int c[N], siz[N], big[N], cnt[N], tr[N];
vector<int> G[N];
vector<pair<int, int> > ans;
vector<pair<int, int> > que[N];
int lowbit(int x) { return x & (-x); }
void update(int pos, int val) {
  for (int i = pos; i <= mxcol; i += lowbit(i)) {
    tr[i] += val;
  }
}
int query(int pos) {
  pos = min(pos, mxcol);
  int ans = 0;
  for (int i = pos; i; i -= lowbit(i)) {
    ans += tr[i];
  }
  return ans;
}
void dfsize(int v, int fa) {
  siz[v] = 1;
  for (int u : G[v]) {
    if (u == fa) continue;
    dfsize(u, v);
    siz[v] += siz[u];
  }
}
void add(int v, int fa, int val) {
  if (cnt[c[v]]) update(cnt[c[v]], -1);
  cnt[c[v]] += val;
  if (cnt[c[v]]) update(cnt[c[v]], 1);
  for (int u : G[v]) {
    if (u != fa && !big[u]) add(u, v, val);
  }
}
void dfs(int v, int fa, bool keep) {
  int son = 0, ms = 0;
  for (int u : G[v])
    if (u != fa && siz[u] > ms) son = u, ms = siz[u];
  for (int u : G[v])
    if (u != fa && u != son) dfs(u, v, 0);
  if (son) dfs(son, v, 1), big[son] = 1;
  add(v, fa, 1);
  if (!que[v].empty()) {
    int tot = query(mxcol);
    for (pair<int, int> q : que[v]) {
      ans.emplace_back(q.first, tot - query(q.second - 1));
    }
  }
  if (son) big[son] = 0;
  if (!keep) add(v, fa, -1);
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> m;
  for (int i = 1; i <= n; ++i) {
    cin >> c[i];
  }
  for (int v, u, i = 1; i < n; ++i) {
    cin >> v >> u;
    G[v].push_back(u);
    G[u].push_back(v);
  }
  for (int v, k, i = 1; i <= m; ++i) {
    cin >> v >> k;
    que[v].emplace_back(i, k);
  }
  mxcol = n;
  dfsize(1, 1);
  dfs(1, 1, 1);
  sort(ans.begin(), ans.end());
  for (pair<int, int> pa : ans) {
    cout << pa.second << endl;
  }
}
