#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 85 - 69, maxseg = maxn * 18;
int lastseg, n;
vector<int> adj[maxn], FrEe;
struct Node {
  int value, chL, chR;
  Node() {
    value = 0;
    chL = chR = -1;
    return;
  }
  int left(void) {
    if (chL == -1) {
      chL = FrEe.back();
      FrEe.pop_back();
    }
    return chL;
  }
  int right(void) {
    if (chR == -1) {
      chR = FrEe.back();
      FrEe.pop_back();
    }
    return chR;
  }
  void clear(void) {
    if (chL != -1) FrEe.push_back(chL);
    if (chR != -1) FrEe.push_back(chR);
    value = 0;
    chL = chR = -1;
    return;
  }
} node[maxseg];
struct esmeto_chi_bezaram_akhe_man {
  int root;
  set<pair<int, int> > st;
  esmeto_chi_bezaram_akhe_man() { return; }
  void clear(Node &v) {
    if (v.chL != -1) clear(node[v.chL]);
    if (v.chR != -1) clear(node[v.chR]);
    v.clear();
    return;
  }
  void clear(void) {
    st.clear();
    clear(node[root]);
    root = 0;
    return;
  }
  void add(int idx, int val, int l, int r, Node &v) {
    v.value += val;
    if (r - l == 1) return;
    int mid = (l + r) >> 1;
    if (idx < mid) {
      add(idx, val, l, mid, node[v.left()]);
      if (node[v.chL].value == 0) {
        node[v.chL].clear();
        FrEe.push_back(v.chL);
        v.chL = -1;
      }
    }
    if (idx >= mid) {
      add(idx, val, mid, r, node[v.right()]);
      if (node[v.chR].value == 0) {
        node[v.chR].clear();
        FrEe.push_back(v.chR);
        v.chR = -1;
      }
    }
    return;
  }
  int get(int st, int en, int l, int r, Node &v) {
    if (st <= l and r <= en) return v.value;
    int mid = (l + r) >> 1;
    int ret = 0;
    if (st < mid and v.chL != -1) ret += get(st, en, l, mid, node[v.left()]);
    if (en > mid and v.chR != -1) ret += get(st, en, mid, r, node[v.right()]);
    return ret;
  }
  void insert(int color, int cnt) {
    auto it = st.lower_bound(make_pair(color, 0));
    if (it != st.end() and it->first == color) {
      add(it->second, -1, 1, n + 1, node[root]);
      cnt += it->second;
      st.erase(it);
    }
    st.insert(make_pair(color, cnt));
    add(cnt, +1, 1, n + 1, node[root]);
    return;
  }
} stru[maxn];
vector<pair<int, int> > quer[maxn];
int col[maxn], InDeX[maxn], ans[maxn];
int q;
void dfs(int v, int p = -1) {
  if (p != -1 and ((int)(adj[v]).size()) == 1) {
    InDeX[v] = lastseg++;
    stru[InDeX[v]].root = FrEe.back();
    FrEe.pop_back();
  } else {
    int w = adj[v][adj[v][0] == p];
    for (auto u : adj[v])
      if (u != p) {
        dfs(u, v);
        if (((int)(stru[InDeX[u]].st).size()) >
            ((int)(stru[InDeX[w]].st).size()))
          w = u;
      }
    InDeX[v] = InDeX[w];
    for (auto u : adj[v])
      if (u != p and u != w) {
        for (auto val : stru[InDeX[u]].st) {
          stru[InDeX[v]].insert(val.first, val.second);
        }
        stru[InDeX[u]].clear();
      }
  }
  stru[InDeX[v]].insert(col[v], 1);
  for (auto Q : quer[v])
    ans[Q.second] =
        stru[InDeX[v]].get(Q.first, n + 1, 1, n + 1, node[stru[InDeX[v]].root]);
  return;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  FrEe.reserve(maxseg);
  for (int i = maxseg - 1; i >= 0; i--) FrEe.push_back(i);
  cin >> n >> q;
  for (int i = 0; i < n; i++) cin >> col[i];
  for (int i = 1; i < n; i++) {
    int fi, se;
    cin >> fi >> se;
    fi--, se--;
    adj[fi].push_back(se);
    adj[se].push_back(fi);
  }
  for (int i = 0; i < q; i++) {
    int qv, qk;
    cin >> qv >> qk;
    qv--;
    quer[qv].push_back({qk, i});
  }
  dfs(0);
  for (int i = 0; i < q; i++) cout << ans[i] << '\n';
  return 0;
}
