#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
const int base = 31337;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
const int logo = 20;
const int off = 1 << logo;
const int treesiz = off << 1;
const int block = 300;
struct query {
  int x, y;
  int val;
  int ind;
  query() {}
  query(int x, int y, int val, int ind) {
    this->x = x;
    this->y = y;
    this->val = val;
    this->ind = ind;
  }
};
int n, m;
vector<int> graph[maxn];
int niz[maxn];
int dis[maxn], fin[maxn];
int c[maxn];
query qs[maxn];
int loga[maxn], cnt[maxn];
int sol[maxn];
void update(int x, int val) {
  for (x++; x < maxn; x += x & -x) loga[x] += val;
}
int que(int x) {
  int out = 0;
  for (x++; x > 0; x -= x & -x) out += loga[x];
  return out;
}
int t = 0;
void dfs(int x, int parr) {
  dis[x] = ++t;
  c[dis[x]] = niz[x];
  for (int i = 0; i < graph[x].size(); i++) {
    int tren = graph[x][i];
    if (tren != parr) dfs(tren, x);
  }
  fin[x] = t;
}
bool cmp(query &a, query &b) {
  if (a.x / block != b.x / block) return a.x < b.x;
  if (a.y != b.y) return a.y < b.y;
  return a.ind < b.ind;
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) scanf("%d", niz + i);
  for (int i = 1; i < n; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    graph[a].push_back(b);
    graph[b].push_back(a);
  }
  dfs(1, -1);
  for (int i = 0; i < m; i++) {
    int v, k;
    scanf("%d%d", &v, &k);
    qs[i] = query(dis[v], fin[v], k, i);
  }
  sort(qs, qs + m, cmp);
  update(1, 1);
  cnt[c[0]] = 1;
  int l = 0, r = 0;
  for (int i = 0; i < m; i++) {
    int x = qs[i].x;
    int y = qs[i].y;
    while (r < y) {
      r++;
      update(cnt[c[r]], -1);
      cnt[c[r]]++;
      update(cnt[c[r]], 1);
    }
    while (l > x) {
      l--;
      update(cnt[c[l]], -1);
      cnt[c[l]]++;
      update(cnt[c[l]], 1);
    }
    while (l < x) {
      update(cnt[c[l]], -1);
      cnt[c[l]]--;
      update(cnt[c[l]], 1);
      l++;
    }
    while (r > y) {
      update(cnt[c[r]], -1);
      cnt[c[r]]--;
      update(cnt[c[r]], 1);
      r--;
    }
    sol[qs[i].ind] = que(maxn - 5) - que(qs[i].val - 1);
  }
  for (int i = 0; i < m; i++) printf("%d\n", sol[i]);
  return 0;
}
