#include <bits/stdc++.h>
using namespace std;
const int mod = 1000000007;
const int N = 100004;
int sz[N], c[N];
vector<pair<int, int> > qu[N];
vector<int> e[N];
int ans[N];
void dfs0(int u, int p) {
  sz[u] = 1;
  for (auto v : e[u])
    if (v != p) {
      dfs0(v, u);
      sz[u] += sz[v];
    }
}
int ft[N];
int maxn;
void upd(int p, int x) {
  if (p == 0) return;
  for (; p <= maxn; p += p & -p) {
    ft[p] += x;
  }
}
int get(int p) {
  int ret = 0;
  for (; p; p -= p & -p) {
    ret += ft[p];
  }
  return ret;
}
int cnt[N];
bool nup[N];
void add(int u, int p, int x) {
  upd(cnt[c[u]], -1);
  cnt[c[u]] += x;
  upd(cnt[c[u]], 1);
  for (auto v : e[u])
    if (v != p && !nup[v]) {
      add(v, u, x);
    }
}
void dfs1(int u, int p, int kp) {
  int b = -1;
  for (auto v : e[u])
    if (v != p) {
      if (b == -1 || sz[b] < sz[v]) b = v;
    }
  for (auto v : e[u])
    if (v != p && v != b) {
      dfs1(v, u, 0);
    }
  if (b != -1) {
    dfs1(b, u, 1);
    nup[b] = true;
  }
  add(u, p, 1);
  for (auto it : qu[u]) {
    if (it.first > maxn)
      ans[it.second] = 0;
    else
      ans[it.second] = get(maxn) - get(it.first - 1);
  }
  if (b != -1) {
    nup[b] = false;
  }
  if (kp == 0) {
    add(u, p, -1);
  }
}
int main() {
  int n, m;
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= n; ++i) scanf("%d", c + i);
  maxn = n;
  for (int i = 1; i < n; ++i) {
    int u, v;
    scanf("%d %d", &u, &v);
    e[u].push_back(v);
    e[v].push_back(u);
  }
  dfs0(1, -1);
  for (int i = 0; i < m; ++i) {
    int u, v;
    scanf("%d %d", &u, &v);
    qu[u].push_back(pair<int, int>(v, i));
  }
  dfs1(1, -1, 1);
  for (int i = 0; i < m; ++i) printf("%d\n", ans[i]);
}
