#include <bits/stdc++.h>
using namespace std;
vector<int> adj[200010];
int col[200010], ans[200010], arr[200010], st[200010], en[200010], sz[200010],
    heavy[200010], bit[200010], cnt[200010], tme;
vector<pair<int, int>> qr[200010];
void dfsst(int node, int p) {
  int mx = 0;
  sz[node] = 1;
  st[node] = ++tme;
  arr[tme] = node;
  for (int i = 0; i < adj[node].size(); i++) {
    int child = adj[node][i];
    if (p != child) {
      dfsst(child, node);
      sz[node] += sz[child];
      if (sz[child] > mx) {
        heavy[node] = child;
        mx = sz[child];
      }
    }
  }
  en[node] = tme;
}
void update(int node, int v) {
  for (; node <= 200010; node += node & -node) bit[node] += v;
}
int query(int node) {
  int ans = 0;
  for (; node > 0; node -= node & -node) ans += bit[node];
  return ans;
}
void dfs(int node, int p, bool keep) {
  for (int i = 0; i < adj[node].size(); i++) {
    int child = adj[node][i];
    if (p != child && child != heavy[node]) {
      dfs(child, node, 0);
    }
  }
  if (heavy[node]) dfs(heavy[node], node, 1);
  update(200010 - 1 - cnt[col[node]], -1);
  cnt[col[node]] += 1;
  update(200010 - 1 - cnt[col[node]], 1);
  for (int i = 0; i < adj[node].size(); i++) {
    int child = adj[node][i];
    if (p != child && child != heavy[node]) {
      for (int j = st[child]; j <= en[child]; j++) {
        update(200010 - 1 - cnt[col[arr[j]]], -1);
        cnt[col[arr[j]]] += 1;
        update(200010 - 1 - cnt[col[arr[j]]], 1);
      }
    }
  }
  for (int i = 0; i < qr[node].size(); i++) {
    ans[qr[node][i].second] = query(200010 - 1 - qr[node][i].first);
  }
  if (keep == 0) {
    for (int j = st[node]; j <= en[node]; j++) {
      update(200010 - 1 - cnt[col[arr[j]]], -1);
      cnt[col[arr[j]]] -= 1;
      update(200010 - 1 - cnt[col[arr[j]]], 1);
    }
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  int n, m, u, v;
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    cin >> col[i];
  }
  for (int i = 0; i < n - 1; i++) {
    cin >> u >> v;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  for (int i = 0; i < m; i++) {
    cin >> u >> v;
    qr[u].push_back(make_pair(v, i));
  }
  dfsst(1, -1);
  dfs(1, -1, 1);
  for (int i = 0; i < m; i++) {
    cout << ans[i] << "\n";
  }
  return 0;
}
