#include <bits/stdc++.h>
using namespace std;
struct qry {
  int l, r, id, val;
  int block;
};
int b_search(int X) {
  int S = 0, E = X;
  long long mid;
  while (S < E) {
    mid = (S + E) >> 1;
    if (mid * mid >= X)
      E = mid;
    else
      S = mid + 1;
  }
  return E;
}
class MoAlgo {
  int n, q;
  vector<int> data;
  vector<int> ans;
  vector<int> q_idx;
  vector<qry> Q;
  int t;
  vector<vector<int> > adj;
  vector<int> tdata, visited, in_t, out_t, idx;
  map<int, int> in_times;
  void dfs(int curr) {
    in_times[t] = curr;
    in_t[curr] = t++;
    idx[curr] = data.size();
    data.push_back(tdata[curr]);
    visited[curr] = true;
    for (auto &x : adj[curr]) {
      if (!visited[x]) dfs(x);
    }
    out_t[curr] = t++;
  }

 public:
  bool operator()(const int &x, const int &y) const {
    if (Q[x].block == Q[y].block) return Q[x].r < Q[y].r;
    return Q[x].block < Q[y].block;
  }
  MoAlgo(int N = 0, int M = 0)
      : n(N),
        q(M),
        tdata(N),
        adj(N),
        visited(N),
        t(0),
        in_t(N),
        out_t(N),
        q_idx(M),
        Q(M),
        idx(N),
        ans(M) {
    int bs = b_search(N);
    for (auto &x : tdata) {
      scanf("%d", &x);
      --x;
    }
    for (int i = 0; i < n - 1; i++) {
      int u, v;
      scanf("%d%d", &u, &v);
      --u, --v;
      adj[u].push_back(v);
      adj[v].push_back(u);
    }
    dfs(0);
    for (int i = 0; i < M; i++) {
      int u;
      scanf("%d%d", &u, &Q[i].val);
      --u;
      int s = in_t[u], e = out_t[u];
      Q[i].l = idx[in_times[s]];
      Q[i].r = idx[(--in_times.lower_bound(e))->second];
      Q[i].block = Q[i].l / bs;
      Q[i].id = i;
      q_idx[i] = i;
    }
    sort(q_idx.begin(), q_idx.end(),
         [this](int x, int y) { return (*this)(x, y); });
    vector<int> col(1e5), suffix_sum(N + 1);
    int L = 0, R = 0;
    col[data[0]]++;
    suffix_sum[1] = 1;
    suffix_sum[0] = 1;
    for (auto &x : q_idx) {
      int left = Q[x].l, right = Q[x].r, k = Q[x].val, id = Q[x].id;
      if (left == N + 1 || k >= N) {
        ans[id] = 0;
        continue;
      }
      while (R > right) {
        suffix_sum[col[data[R]]]--;
        col[data[R]]--;
        R--;
      }
      while (R < right) {
        ++R;
        col[data[R]]++;
        suffix_sum[col[data[R]]]++;
      }
      while (L < left) {
        suffix_sum[col[data[L]]]--;
        col[data[L]]--;
        L++;
      }
      while (L > left) {
        --L;
        col[data[L]]++;
        suffix_sum[col[data[L]]]++;
      }
      ans[id] = suffix_sum[k];
    }
    for (int i = 0; i < M; i++) printf("%d\n", ans[i]);
  }
};
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  new MoAlgo(n, m);
  return 0;
}
