#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
vector<int> G[N];
vector<pair<int, pair<int, int> > > query;
int color[N], Ecolor[2 * N], f[N], s[2 * N], start[N], finish[N], ans[N];
int n, m, u, v, cnt;
int block_size;
void dfs(int u) {
  start[u] = ++cnt;
  Ecolor[cnt] = color[u];
  for (int i = 0; i < G[u].size(); ++i) {
    int v = G[u][i];
    if (!start[v]) dfs(v);
  }
  finish[u] = ++cnt;
  Ecolor[cnt] = color[u];
}
bool mo_cmp(pair<int, pair<int, int> > p, pair<int, pair<int, int> > q) {
  u = p.second.first, v = q.second.first;
  if (start[u] / block_size == start[v] / block_size)
    return finish[u] < finish[v];
  return start[u] / block_size < start[v] / block_size;
}
void add(int pos) {
  f[Ecolor[pos]]++;
  s[f[Ecolor[pos]]]++;
}
void rem(int pos) {
  s[f[Ecolor[pos]]]--;
  f[Ecolor[pos]]--;
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n >> m;
  block_size = sqrt(n);
  for (int i = 1; i <= n; ++i) cin >> color[i];
  for (int i = 1; i < n; ++i) {
    cin >> u >> v;
    G[u].push_back(v);
    G[v].push_back(u);
  }
  dfs(1);
  for (int i = 0; i < m; ++i) {
    cin >> u >> v;
    query.push_back(pair<int, pair<int, int> >(i, pair<int, int>(u, v)));
  }
  sort(query.begin(), query.end(), mo_cmp);
  int curL = 1, curR = 1;
  add(1);
  for (int i = 0; i < query.size(); ++i) {
    int p = query[i].second.first;
    while (curL < start[p]) {
      rem(curL);
      curL++;
    }
    while (curL > start[p]) {
      curL--;
      add(curL);
    }
    while (curR < finish[p]) {
      curR++;
      add(curR);
    }
    while (curR > finish[p]) {
      rem(curR);
      curR--;
    }
    ans[query[i].first] = s[query[i].second.second * 2];
  }
  for (int i = 0; i < m; ++i) cout << ans[i] << '\n';
}
