#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5;
int n, m, c[maxn], ans[maxn];
vector<int> g[maxn], q[maxn], qid[maxn];
map<int, int> mp2[maxn];
map<int, int> mp1[maxn];
inline void insert(int v, int c, int cnt) {
  int hlp = mp2[v][c];
  if (hlp) mp1[v][hlp]--;
  hlp += cnt;
  mp2[v][c] = hlp;
  mp1[v][hlp]++;
}
inline void init() {
  scanf("%d %d", &n, &m);
  for (int i = 0; i < n; i++) {
    scanf("%d", c + i);
    c[i]--;
    insert(i, c[i], 1);
  }
  for (int u, v, i = 0; i < n - 1; i++) {
    scanf("%d %d", &u, &v);
    u--, v--;
    g[v].push_back(u);
    g[u].push_back(v);
  }
  for (int v, k, i = 0; i < m; i++) {
    scanf("%d %d", &v, &k);
    v--;
    q[v].push_back(k);
    qid[v].push_back(i);
  }
}
inline void dfs(int v, int par) {
  for (int i = 0; i < g[v].size(); i++)
    if (g[v][i] != par) {
      int u = g[v][i];
      dfs(u, v);
      if (mp2[u].size() > mp2[v].size()) {
        mp1[v].swap(mp1[u]);
        mp2[v].swap(mp2[u]);
      }
      for (map<int, int>::iterator it = mp2[u].begin(); it != mp2[u].end();
           it++)
        insert(v, it->first, it->second);
      mp1[u].clear();
      mp2[u].clear();
    }
  for (int i = 0; i < q[v].size(); i++)
    for (map<int, int>::reverse_iterator it = mp1[v].rbegin();
         it != mp1[v].rend(); it++)
      if (q[v][i] <= it->first)
        ans[qid[v][i]] += it->second;
      else
        break;
}
inline void solve() {
  dfs(0, -1);
  for (int i = 0; i < m; i++) printf("%d\n", ans[i]);
}
int main() {
  init();
  solve();
}
