#include <bits/stdc++.h>
using namespace std;
template <class T>
bool fs(T &v) {
  v = 0;
  char c = getchar();
  while (c != EOF && c != '-' && !isdigit(c)) c = getchar();
  if (c == EOF) return false;
  bool neg = c == '-';
  if (neg) c = getchar();
  while (isdigit(c)) {
    v = v * 10 + c - '0';
    c = getchar();
  }
  if (neg) v = -v;
  return true;
}
const int mx = 1e5 + 10;
int n, q, cl[mx], child[mx], rvmp[mx], cnt[mx], block;
vector<int> adj[mx];
vector<int> arr, col;
vector<pair<pair<int, int>, pair<int, int> > > query;
int anss[mx];
long long BIT[mx];
void dfs(int x, int par) {
  arr.push_back(x);
  col.push_back(cl[x]);
  child[x] = 1;
  for (int i : adj[x]) {
    if (i == par) continue;
    dfs(i, x);
    child[x] += child[i];
  }
}
bool cmp(pair<pair<int, int>, pair<int, int> > a,
         pair<pair<int, int>, pair<int, int> > b) {
  int aa = a.first.first / block;
  int bb = b.first.first / block;
  if (aa == bb) return a.first.second < b.first.second;
  return aa < bb;
}
void init() {
  int u, v;
  for (int i = (0); i < (n); i++) rvmp[arr[i]] = i;
  for (int i = (0); i < (q); i++) {
    scanf("%d", &u);
    scanf("%d", &v);
    query.push_back(
        make_pair(make_pair(rvmp[u], rvmp[u] + child[u] - 1), make_pair(v, i)));
  }
  block = sqrt(n);
  sort(query.begin(), query.end(), cmp);
}
void update(int x, int val) {
  for (; x <= n; x += x & -x) BIT[x] += val;
}
long long Query(int x) {
  long long ans = 0;
  for (; x > 0; x -= x & -x) {
    ans += BIT[x];
  }
  return ans;
}
inline void add(int i) {
  cnt[col[i]]++;
  BIT[cnt[col[i]]]++;
}
inline void remove(int i) {
  BIT[cnt[col[i]]]--;
  cnt[col[i]]--;
}
void solve() {
  int l = 0, r = -1;
  for (int i = (0); i < (q); i++) {
    int lf = query[i].first.first, rf = query[i].first.second,
        v = query[i].second.first, inx = query[i].second.second;
    while (r < rf) {
      r++;
      add(r);
    }
    while (r > rf) {
      remove(r);
      r--;
    }
    while (l < lf) {
      remove(l);
      l++;
    }
    while (l > lf) {
      l--;
      add(l);
    }
    anss[inx] = BIT[v];
  }
}
int main() {
  int u, v;
  scanf("%d", &n);
  scanf("%d", &q);
  for (int i = (1); i < (n + 1); i++) scanf("%d", &cl[i]);
  for (int i = (0); i < (n - 1); i++) {
    scanf("%d", &u);
    scanf("%d", &v);
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  dfs(1, -1);
  init();
  solve();
  for (int i = (0); i < (q); i++) printf("%d\n", anss[i]);
  return 0;
}
