#include <bits/stdc++.h>
using namespace std;
const int inv = 1000000000;
const int minv = -inv;
const int max_n = 100010;
const int max_q = 100010;
const int lim = 100010;
const int chunk = 320;
vector<int> bA;
struct BIT {
  int bn;
  BIT() { bn = 0; }
  BIT(int bn_) {
    bn = bn_;
    bA.resize(bn + 10);
    fill(bA.begin(), bA.end(), 0);
  }
  int prefix(int bposn) {
    ++bposn;
    int ret = 0;
    for (int i = bposn; i > 0; i -= ((i) & (-i))) ret += bA[i];
    return ret;
  }
  void update(int bposn, int bincr) {
    ++bposn;
    for (int i = bposn; i <= bn + 5; i += ((i) & (-i))) bA[i] += bincr;
  }
};
int n, q;
int cold[max_n];
int cnew[max_n];
vector<int> adjl[max_n];
bool visited[max_n] = {0};
int pro[max_n], npro = 0;
int proid[max_n];
int minid[max_n], maxid[max_n];
void DFS(int vt) {
  visited[vt] = true;
  pro[npro] = vt;
  proid[vt] = npro;
  ++npro;
  minid[vt] = proid[vt];
  maxid[vt] = proid[vt];
  int nb;
  for (int i = 0; i < adjl[vt].size(); ++i) {
    nb = adjl[vt][i];
    if (not visited[nb]) {
      DFS(nb);
      minid[vt] = min(minid[vt], minid[nb]);
      maxid[vt] = max(maxid[vt], maxid[nb]);
    }
  }
}
struct query {
  int ql, qr, qk, ix;
  query() {}
  query(int ql_, int qr_, int qk_, int ix_) {
    ql = ql_;
    qr = qr_;
    qk = qk_;
    ix = ix_;
  }
};
struct less_query : public binary_function<query, query, bool> {
  bool operator()(const query &a, const query &b) {
    return (pair<int, int>(a.qr, a.ql) < pair<int, int>(b.qr, b.ql));
  }
};
vector<query> Q[chunk + 5];
int l, r;
BIT bit;
int ct[lim + 10];
int res[max_q];
void add(int x) {
  bit.update(ct[cnew[x]], -1);
  ++ct[cnew[x]];
  bit.update(ct[cnew[x]], 1);
}
void del(int x) {
  bit.update(ct[cnew[x]], -1);
  --ct[cnew[x]];
  bit.update(ct[cnew[x]], 1);
}
void incl() {
  if (l <= r) del(l);
  ++l;
}
void decl() {
  --l;
  if (l <= r) add(l);
}
void incr() {
  ++r;
  if (l <= r) add(r);
}
int main() {
  scanf("%d", &n);
  scanf("%d", &q);
  for (int i = 0; i < n; ++i) {
    scanf("%d", &cold[i]);
    --cold[i];
  }
  int u, v;
  for (int i = 0; i < n - 1; ++i) {
    scanf("%d", &u);
    scanf("%d", &v);
    --u;
    --v;
    adjl[u].push_back(v);
    adjl[v].push_back(u);
  }
  DFS(0);
  for (int i = 0; i < n; ++i) cnew[i] = cold[pro[i]];
  for (int i = 0; i <= (n - 1) / chunk; ++i) Q[i].resize(0);
  for (int i = 0; i < q; ++i) {
    int cv, cl, cr, ck;
    scanf("%d", &cv);
    --cv;
    scanf("%d", &ck);
    cl = minid[cv];
    cr = maxid[cv];
    Q[cl / chunk].push_back(query(cl, cr, ck, i));
  }
  for (int i = 0; i <= (n - 1) / chunk; ++i)
    sort(Q[i].begin(), Q[i].end(), less_query());
  for (int i = 0; i <= (n - 1) / chunk; ++i) {
    if (Q[i].size() == 0) continue;
    l = Q[i][0].ql;
    r = Q[i][0].ql;
    bit = BIT(lim);
    fill(ct, ct + lim, 0);
    ++ct[cnew[l]];
    bit.update(0, lim - 1);
    bit.update(1, 1);
    for (int j = 0; j < Q[i].size(); ++j) {
      query cq = Q[i][j];
      while (l < cq.ql) incl();
      while (l > cq.ql) decl();
      while (r < cq.qr) incr();
      int cres = lim - bit.prefix(cq.qk - 1);
      res[cq.ix] = cres;
    }
  }
  for (int i = 0; i < q; ++i) {
    printf("%d\n", res[i]);
  }
  return 0;
}
