#include <bits/stdc++.h>
using namespace std;
struct node {
  int l, r, w, id;
  node(int _l, int _r, int _w, int _id) : l(_l), r(_r), w(_w), id(_id) {}
};
int n, m, sn, cnt;
int c[200005], cc[200005];
int L[200005], R[200005];
int num[200005], cnt_num[200005];
int ans[200005];
vector<node> q;
vector<int> e[200005];
const int cmp(const node &a, const node &b) {
  int xa = a.l / sn;
  int xb = b.l / sn;
  if (xa == xb) return a.r < b.r;
  return a.l < b.l;
}
void dfs(int u, int fa) {
  L[u] = ++cnt;
  cc[cnt] = c[u];
  for (auto v : e[u]) {
    if (v == fa) continue;
    dfs(v, u);
  }
  R[u] = ++cnt;
  cc[cnt] = c[u];
}
inline void add(int x) { cnt_num[++num[x]]++; }
inline void sub(int x) { cnt_num[num[x]--]--; }
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  while (cin >> n >> m) {
    cnt = 0;
    sn = sqrt(n);
    memset(num, 0, sizeof(num));
    memset(cnt_num, 0, sizeof(cnt_num));
    for (int i = (1); i <= (n); i++) cin >> c[i];
    for (int i = (1); i <= (n - 1); i++) {
      int x, y;
      cin >> x >> y;
      e[x].push_back(y);
      e[y].push_back(x);
    }
    dfs(1, -1);
    for (int i = (1); i <= (m); i++) {
      int x, y;
      cin >> x >> y;
      q.push_back(node(L[x], R[x], y, i));
    }
    sort(q.begin(), q.end(), cmp);
    int l = 1, r = 0;
    for (auto u : q) {
      while (l < u.l) {
        sub(cc[l]);
        l++;
      }
      while (l > u.l) {
        l--;
        add(cc[l]);
      }
      while (r > u.r) {
        sub(cc[r]);
        r--;
      }
      while (r < u.r) {
        r++;
        add(cc[r]);
      }
      ans[u.id] = cnt_num[2 * u.w];
    }
    for (int i = (1); i <= (m); i++) printf("%d\n", ans[i]);
  }
  return 0;
}
