#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5 + 10;
const int sq = 555;
int ans[maxn];
int cnt[maxn];
int startingtime[maxn];
int par[maxn];
int finishingtime[maxn];
int s;
int n;
int c;
int m;
int id[maxn];
int l[maxn];
int r[maxn];
int a[maxn];
bool mark[maxn];
int w[maxn];
int cnv;
vector<int> adj[maxn];
int k[maxn];
int anv[maxn];
int mp[maxn];
inline void dfs(int v) {
  mark[v] = true;
  startingtime[v] = cnv++;
  mp[startingtime[v]] = v;
  for (int i = 0; i < adj[v].size(); i++) {
    if (mark[adj[v][i]] == false) {
      dfs(adj[v][i]);
    }
  }
  finishingtime[v] = cnv;
  return;
}
inline bool cmp(int a, int b) {
  if (l[a] / sq != l[b] / sq) {
    return l[a] < l[b];
  }
  if ((l[a] / sq) % 2 == 1) {
    return r[a] > r[b];
  }
  return r[a] < r[b];
}
inline void add(int v, int sign) {
  cnt[a[mp[v]]] += sign;
  if (sign == 1) {
    anv[cnt[a[mp[v]]]]++;
  } else {
    anv[cnt[a[mp[v]]] + 1]--;
  }
  return;
}
int main() {
  scanf("%d", &n);
  scanf("%d", &m);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
  }
  for (int i = 0; i < n - 1; i++) {
    int u1;
    int u2;
    scanf("%d", &u1);
    scanf("%d", &u2);
    adj[u1].push_back(u2);
    adj[u2].push_back(u1);
  }
  dfs(1);
  for (int i = 0; i < m; i++) {
    scanf("%d", &w[i]);
    scanf("%d", &k[i]);
    l[i] = startingtime[w[i]];
    r[i] = finishingtime[w[i]];
  }
  iota(id, id + m, 0);
  sort(id, id + m, cmp);
  int L = 0;
  int R = 0;
  for (int i = 0; i < m; i++) {
    int f = id[i];
    while (R < r[f]) {
      add(R++, +1);
    }
    while (L > l[f]) {
      add(--L, +1);
    }
    while (R > r[f]) {
      add(--R, -1);
    }
    while (L < l[f]) {
      add(L++, -1);
    }
    ans[f] = anv[k[f]];
  }
  for (int i = 0; i < m; i++) {
    cout << ans[i] << endl;
  }
}
