#include <bits/stdc++.h>
using namespace std;
const int mod = 1000 * 1000 * 1000 + 7;
const int INF = 1000 * 1000 * 1000;
const long long LINF = (long long)INF * INF;
struct Query {
  int l, r, ind, k;
};
int n, m;
int c[100100];
vector<int> adj[100100];
int cnt[100100], bnd[100100];
int ans[100100];
vector<int> st;
int sttime[100100];
int fntime[100100];
Query qr[100100];
void dfs(int v, int par) {
  st.push_back(v);
  sttime[v] = st.size() - 1;
  for (int u : adj[v]) {
    if (u == par) {
      continue;
    }
    dfs(u, v);
  }
  fntime[v] = st.size() - 1;
}
bool mos_cmp(Query &a, Query &b) {
  if (a.l / 400 == b.l / 400) {
    return (a.l / 400 % 2 ? a.r > b.r : a.r < b.r);
  }
  return a.l / 400 < b.l / 400;
}
void mos_add(int i) {
  cnt[c[i]]++;
  bnd[cnt[c[i]]]++;
}
void mos_rem(int i) {
  bnd[cnt[c[i]]]--;
  cnt[c[i]]--;
}
int main(void) {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  ;
  cin >> n >> m;
  for (int i = (1); i < (n + 1); i++) {
    cin >> c[i];
  }
  for (int i = (0); i < (n - 1); i++) {
    int ai, bi;
    cin >> ai >> bi;
    adj[ai].push_back(bi);
    adj[bi].push_back(ai);
  }
  dfs(1, -1);
  for (int i = (0); i < (m); i++) {
    int vi, ki;
    cin >> vi >> ki;
    qr[i].l = sttime[vi];
    qr[i].r = fntime[vi];
    qr[i].k = ki;
    qr[i].ind = i;
  }
  sort(qr, qr + m, mos_cmp);
  int l = 0, r = -1;
  for (int i = (0); i < (m); i++) {
    while (l > qr[i].l) {
      l--;
      mos_add(st[l]);
    }
    while (r < qr[i].r) {
      r++;
      mos_add(st[r]);
    }
    while (l < qr[i].l) {
      mos_rem(st[l]);
      l++;
    }
    while (r > qr[i].r) {
      mos_rem(st[r]);
      r--;
    }
    ans[qr[i].ind] = bnd[qr[i].k];
  }
  for (int i = (0); i < (m); i++) {
    cout << ans[i] << '\n';
  }
  return 0;
}
