#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-7;
const double PI = acos(-1);
const long long INFF = (long long)1e18;
const int INF = (int)1e9;
const int mod = (int)1e9 + 7;
const int MAX = (int)1e5 + 7;
vector<int> edge[MAX];
int c[MAX];
vector<pair<int, int> > Q[MAX];
int sub[MAX], ans[MAX];
int n, m;
map<int, int> mp[MAX];
map<int, int> re_mp[MAX];
void init() {
  scanf("%d %d", &n, &m);
  for (int i = (1); i < (n + 1); ++i) scanf("%d", c + i);
  for (int i = 0; i < (n - 1); ++i) {
    int u, v;
    scanf("%d %d", &u, &v);
    ;
    edge[u].push_back(v);
    edge[v].push_back(u);
  }
  for (int i = 0; i < (m); ++i) {
    int u, v;
    scanf("%d %d", &u, &v);
    ;
    Q[u].push_back(make_pair(v, i));
  }
  for (int i = (1); i < (n + 1); ++i) sort((Q[i]).begin(), (Q[i]).end());
  return;
}
void dfs(int u, int pa) {
  for (int v : edge[u]) {
    if (v == pa) continue;
    dfs(v, u);
    if (((int)mp[sub[v]].size()) > ((int)mp[sub[u]].size()))
      swap(sub[u], sub[v]);
    auto it = mp[sub[v]].begin();
    while (it != mp[sub[v]].end()) {
      int val = mp[sub[u]][it->first];
      if (val) re_mp[sub[u]][val]--;
      mp[sub[u]][it->first] += it->second;
      re_mp[sub[u]][val + it->second]++;
      it++;
    }
  }
  int cnt = 0;
  auto it = --re_mp[sub[u]].end();
  bool fg = 0;
  for (int i = ((int)Q[u].size()) - 1; i >= 0; --i) {
    pair<int, int> x = Q[u][i];
    while (!fg && it->first >= x.first) {
      cnt += it->second;
      if (it == re_mp[sub[u]].begin())
        fg = 1;
      else
        it--;
    }
    ans[x.second] = cnt;
  }
  return;
}
void sol() {
  for (int i = (1); i < (n + 1); ++i) sub[i] = i;
  for (int i = (1); i < (n + 1); ++i) {
    mp[i][c[i]]++;
    re_mp[i][1]++;
  }
  dfs(1, 0);
  for (int i = 0; i < (m); ++i) printf("%d\n", ans[i]);
  return;
}
int main(void) {
  init();
  sol();
  return 0;
}
