#include <bits/stdc++.h>
using namespace std;
int color[100005];
vector<int> DSK[100005];
int num = 0, block_size;
int S[100005], E[100005], c[100005];
struct query {
  int l, r, k, id;
} Q[100005];
void DFS(int u, int pre) {
  S[u] = ++num;
  c[num] = color[u];
  for (int i = 0; i < DSK[u].size(); i++) {
    int w = DSK[u][i];
    if (w != pre) DFS(w, u);
  }
  E[u] = num;
}
int cnt[100005], ans[100005], res[100005];
void add(int i) {
  cnt[c[i]]++;
  ans[cnt[c[i]]]++;
}
void del(int i) {
  ans[cnt[c[i]]]--;
  cnt[c[i]]--;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n, m;
  cin >> n >> m;
  for (int i = 1; i <= n; i++) cin >> color[i];
  for (int i = 1; i < n; i++) {
    int u, v;
    cin >> u >> v;
    DSK[u].push_back(v);
    DSK[v].push_back(u);
  }
  DFS(1, -1);
  for (int i = 1; i <= m; i++) {
    int v, k;
    cin >> v >> k;
    Q[i] = {S[v], E[v], k, i};
  }
  block_size = sqrt(n);
  sort(Q + 1, Q + 1 + m, [](const query &a, const query &b) {
    if (a.l / block_size == b.l / block_size) return a.r < b.r;
    return a.l / block_size < b.l / block_size;
  });
  int curL = 1, curR = 0;
  for (int i = 1; i <= m; i++) {
    int L = Q[i].l, R = Q[i].r;
    while (curL > L) {
      add(curL - 1);
      curL--;
    }
    while (curR < R) {
      add(curR + 1);
      curR++;
    }
    while (curL < L) {
      del(curL);
      curL++;
    }
    while (curR > R) {
      del(curR);
      curR--;
    }
    res[Q[i].id] = ans[Q[i].k];
  }
  for (int i = 1; i <= m; i++) cout << res[i] << '\n';
}
