#include <bits/stdc++.h>
using namespace std;
const int sz = 1e5 + 5;
int a[sz], sbz[sz], cnt[sz], bit[sz], ans[sz];
vector<int> g[sz], qk[sz], qid[sz];
bitset<sz> heavy;
void fadd(int x, int f) {
  while (x) {
    bit[x] += f;
    x -= x & (-x);
  }
}
int quer(int x) {
  int res = 0;
  while (x < sz) {
    res += bit[x];
    x += x & (-x);
  }
  return res;
}
void add(int u, int p, int f) {
  int &w = cnt[a[u]];
  fadd(w, -1);
  w += f;
  fadd(w, +1);
  for (int v : g[u])
    if (v ^ p && !heavy[v]) add(v, u, f);
}
void dfs(int u = 1, int p = 0, bool keep = 0) {
  int mx = 0, bigc = 0;
  for (int v : g[u])
    if (v ^ p && sbz[v] > mx) mx = sbz[v], bigc = v;
  for (int v : g[u])
    if (v ^ p && v ^ bigc) dfs(v, u);
  if (bigc) heavy[bigc] = 1, dfs(bigc, u, 1);
  add(u, p, 1);
  for (int i = 0; i < qk[u].size(); i++) {
    ans[qid[u][i]] = quer(qk[u][i]);
  }
  heavy[bigc] = 0;
  if (!keep) add(u, p, -1);
}
int getsbz(int u = 1, int p = 0) {
  sbz[u] = 1;
  for (int v : g[u])
    if (v ^ p) sbz[u] += getsbz(v, u);
  return sbz[u];
}
int main() {
  int n, q;
  scanf("%d %d", &n, &q);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  for (int i = 1; i < n; i++) {
    int u, v;
    scanf("%d %d", &u, &v);
    g[u].push_back(v);
    g[v].push_back(u);
  }
  getsbz();
  for (int i = 1; i <= q; i++) {
    int v, k;
    scanf("%d %d", &v, &k);
    qk[v].push_back(k);
    qid[v].push_back(i);
  }
  dfs();
  for (int i = 1; i <= q; i++) printf("%d\n", ans[i]);
}
