#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
vector<int> g[N];
int c[N], freq[N], in[N], out[N], rev[N], ans[N], fen[N], n, m, id = 1, BUCKET;
struct Query {
  int left, right, k, id;
  void read(int i) {
    int temp;
    cin >> temp;
    left = in[temp];
    right = out[temp];
    cin >> k;
    id = i;
  }
  bool operator<(const Query &rhs) const {
    if (left / BUCKET != rhs.left / BUCKET) return left < rhs.left;
    return right < rhs.right;
  }
};
Query queries[N];
void dfs(int node, int parent) {
  rev[id] = node;
  in[node] = id++;
  for (auto &v : g[node]) {
    if (v != parent) dfs(v, node);
  }
  out[node] = id - 1;
}
void modify(int idx, int val) {
  for (++idx; idx < N; idx += idx & -idx) fen[idx] += val;
}
int get(int l, int r) {
  if (l != 0) return get(0, r) - get(0, l - 1);
  int ret = 0;
  for (++r; r > 0; r -= r & -r) ret += fen[r];
  return ret;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m;
  BUCKET = ceil(sqrt(n));
  for (int i = 1; i <= n; ++i) cin >> c[i];
  for (int i = 0; i < n - 1; ++i) {
    int a, b;
    cin >> a >> b;
    g[a].push_back(b);
    g[b].push_back(a);
  }
  dfs(1, 0);
  for (int i = 0; i < m; ++i) queries[i].read(i);
  sort(queries, queries + m);
  modify(0, n);
  int l = 1, r = 0;
  for (int i = 0; i < m; ++i) {
    Query &q = queries[i];
    while (r < q.right) {
      ++r;
      modify(freq[c[rev[r]]], -1);
      ++freq[c[rev[r]]];
      modify(freq[c[rev[r]]], 1);
    }
    while (r > q.right) {
      modify(freq[c[rev[r]]], -1);
      --freq[c[rev[r]]];
      modify(freq[c[rev[r]]], 1);
      --r;
    }
    while (l > q.left) {
      --l;
      modify(freq[c[rev[l]]], -1);
      ++freq[c[rev[l]]];
      modify(freq[c[rev[l]]], 1);
    }
    while (l < q.left) {
      modify(freq[c[rev[l]]], -1);
      --freq[c[rev[l]]];
      modify(freq[c[rev[l]]], 1);
      ++l;
    }
    ans[q.id] = get(q.k, n);
  }
  for (int i = 0; i < m; ++i) cout << ans[i] << '\n';
  return 0;
}
