#include <bits/stdc++.h>
using namespace std;
const int MAX = 200013;
const int MOD = 1000000007;
int c[MAX];
vector<int> g[MAX];
vector<int> euler;
int in[MAX], out[MAX];
int cnt[MAX], ccc[MAX];
int BS;
int ans[MAX];
int vis[MAX];
int tree[MAX];
int ml = 0, mr = -1;
int mxCnt = 1e5;
struct query {
  int v, k, id;
};
vector<query> qry;
bool cmp(const query &a, const query &b) {
  if (in[a.v] / BS == in[b.v] / BS) return out[a.v] / BS < out[b.v] / BS;
  return in[a.v] / BS < in[b.v] / BS;
}
void dfs(int s, int p) {
  euler.push_back(s);
  int sz = euler.size() - 1;
  in[s] = sz;
  for (auto nd : g[s]) {
    if (nd == p) continue;
    dfs(nd, s);
  }
  euler.push_back(s);
  sz = euler.size() - 1;
  out[s] = sz;
}
void update(int idx, int val) {
  while (idx <= mxCnt) {
    tree[idx] += val;
    idx += idx & (-idx);
  }
}
int query(int idx) {
  int sum = 0;
  while (idx > 0) {
    sum += tree[idx];
    idx -= idx & (-idx);
  }
  return sum;
}
void add(int u) {
  if (!vis[u]) {
    vis[u] = 1;
    cnt[c[u]]++;
    if (cnt[c[u]] > 1) update(cnt[c[u]] - 1, -1);
    update(cnt[c[u]], 1);
  }
}
void remove(int u) {
  if (vis[u]) {
    vis[u] = 0;
    cnt[c[u]]--;
    update(cnt[c[u]] + 1, -1);
    if (cnt[c[u]]) update(cnt[c[u]], 1);
  }
}
int Mos(int l, int r, int k) {
  int u;
  while ((mr + 1) <= r) {
    add(euler[mr + 1]);
    ++mr;
  }
  while ((ml - 1) >= l) {
    add(euler[ml - 1]);
    --ml;
  }
  while ((ml + 1) <= l) {
    remove(euler[ml]);
    ++ml;
  }
  while ((mr - 1) >= r) {
    remove(euler[mr]);
    --mr;
  }
  int res = 0;
  if (k <= mxCnt) res = query(mxCnt) - query(k - 1);
  return res;
}
void solve() {
  int n, m;
  cin >> n >> m;
  mxCnt = 0;
  for (int i = 1; i <= n; ++i) {
    cin >> c[i];
    ccc[c[i]]++;
    mxCnt = max(mxCnt, ccc[c[i]]);
  }
  for (int i = 1; i < n; ++i) {
    int u, v;
    cin >> u >> v;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  dfs(1, 0);
  BS = sqrt((int)euler.size());
  for (int i = 0; i < m; ++i) {
    int v, k;
    cin >> v >> k;
    qry.push_back({v, k, i});
  }
  sort(qry.begin(), qry.end(), cmp);
  for (int i = 0; i < m; ++i) {
    int l = in[qry[i].v];
    int r = out[qry[i].v];
    ans[qry[i].id] = Mos(l, r, qry[i].k);
  }
  for (int i = 0; i < m; ++i) {
    cout << ans[i] << "\n";
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int t = 1;
  while (t--) {
    solve();
  }
  return 0;
}
