#include <bits/stdc++.h>
struct query {
  int l, r, k;
  size_t id;
};
std::vector<int> color;
std::vector<std::vector<int>> tree;
std::vector<query> Qs;
std::vector<int> freq;
std::vector<int> freq_counter;
std::vector<int> solution;
std::vector<int> dfs_grey;
std::vector<int> dfs_black;
std::vector<int> flat_tree;
void dfs(int u, int parent, int& time) {
  dfs_grey[u] = ++time;
  flat_tree[time] = color[u];
  for (int& node : tree[u])
    if (node != parent) dfs(node, u, time);
  dfs_black[u] = time;
}
int main() {
  std::ios_base::sync_with_stdio(false);
  int N, M, bucket_size = 512, time = 0;
  std::cin >> N >> M;
  color.resize(N + 1);
  tree.resize(N + 1);
  Qs.resize(M);
  solution.resize(M + 1, 0);
  freq.resize(100001, 0);
  freq_counter.resize(100001, 0);
  dfs_grey.resize(N + 1, 0);
  dfs_black.resize(N + 1, 0);
  flat_tree.resize(N + 1, 0);
  for (size_t i = 0; i < N; i++) std::cin >> color[i];
  int u, v;
  for (size_t i = 0; i < N - 1; ++i) {
    std::cin >> u >> v;
    --u;
    --v;
    tree[u].push_back(v);
    tree[v].push_back(u);
  }
  dfs(0, -1, time);
  for (size_t i = 0; i < M; ++i) {
    int v, k;
    std::cin >> v >> k;
    v--;
    Qs[i] = query{dfs_grey[v], dfs_black[v], k, i};
  }
  auto mo_cmp = [&](query const& a, query const& b) -> bool {
    int left1 = a.l / bucket_size;
    int left2 = b.l / bucket_size;
    return (left1 != left2) ? (a.l < b.l) : (a.r < b.r);
  };
  std::sort(Qs.begin(), Qs.end(), mo_cmp);
  auto add = [&](int pos) {
    freq[flat_tree[pos]]++;
    freq_counter[freq[flat_tree[pos]]]++;
  };
  auto remove = [&](int pos) {
    freq_counter[freq[flat_tree[pos]]]--;
    freq[flat_tree[pos]]--;
  };
  int curr_l = Qs[0].l;
  int curr_r = curr_l - 1;
  for (size_t i = 0; i < M; ++i) {
    while (curr_l > Qs[i].l) {
      curr_l--;
      add(curr_l);
    }
    while (curr_r < Qs[i].r) {
      curr_r++;
      add(curr_r);
    }
    while (curr_l < Qs[i].l) {
      remove(curr_l);
      curr_l++;
    }
    while (curr_r > Qs[i].r) {
      remove(curr_r);
      curr_r--;
    }
    solution[Qs[i].id] = freq_counter[Qs[i].k];
  }
  for (size_t i = 0; i < M; ++i) std::cout << solution[i] << std::endl;
  return 0;
}
