#include <bits/stdc++.h>   #pragma comment(linker,  /STACK:16777216 )   using namespace std;   const long double pi = acos(-1.0);   const long double eps = 1e-6;   const int INF = 1E9;   const int MAXN = 5111;   struct node {     pair<int, int> key;     int pr, cnt;     node *l, *r;     node(pair<int, int> _key) {       key = _key;       pr = rand();       cnt = 1;       l = r = NULL;     }   };   int cnt(node *p) { return p ? p->cnt : 0; }   void upd_cnt(node *&p) {     if (p) p->cnt = 1 + cnt(p->l) + cnt(p->r);   }   void split(node *p, pair<int, int> key, node *&l, node *&r) {     if (p == NULL) {       l = r = NULL;       return;     }     if (key < p->key) {       split(p->l, key, l, p->l);       r = p;     } else {       split(p->r, key, p->r, r);       l = p;     }     upd_cnt(p);   }   void merge(node *&p, node *l, node *r) {     if (l == NULL)       p = r;     else if (r == NULL)       p = l;     else if (l->pr < r->pr) {       p = l;       merge(l->r, l->r, r);     } else {       p = r;       merge(r->l, l, r->l);     }     upd_cnt(p);   }   void insert(pair<int, int> key, int pr, node *&p) {     if (p == NULL) {       p = new node(key);       p->pr = pr;       return;     }     if (pr > p->pr) {       if (key > p->key)         insert(key, pr, p->r);       else         insert(key, pr, p->l);     } else {       node *t = new node(key);       t->pr = pr;       split(p, key, t->l, t->r);       p = t;     }     upd_cnt(p);   }   void erase(pair<int, int> key, node *&p) {     if (p == NULL) return;     if (p->key == key)       merge(p, p->l, p->r);     else {       if (key < p->key)         erase(key, p->l);       else         erase(key, p->r);     }     upd_cnt(p);   }   int n, m;   vector<int> color, used;   vector<vector<int> > g, queries;   vector<pair<int, int> > q;   vector<node *> root;   vector<map<int, int> > lib;   vector<int> ans, link;   void init() {     color.resize(n);     used.resize(n, 0);     root.resize(n, NULL);     g.resize(n);     queries.resize(n);     q.resize(m);     ans.resize(m);     link.resize(n);     lib.resize(n);   }   void intersect(int vid, int wid, node *&w) {     if (!w) return;     if (w->l) intersect(vid, wid, w->l);     if (w->r) intersect(vid, wid, w->r);     int ckey = w->key.second;     if (lib[link[vid]].find(ckey) == lib[link[vid]].end()) {       lib[link[vid]][ckey] = w->key.first;       insert(w->key, rand(), root[vid]);     } else {       erase(make_pair(lib[link[vid]][ckey], ckey), root[vid]);       w->key.first += lib[link[vid]][ckey];       insert(w->key, rand(), root[vid]);       lib[link[vid]][ckey] = w->key.first;     }     lib[link[wid]].erase(ckey);     delete w;   }   void dfs(int v, int par) {     used[v] = 1;     for (int i = 0; i < (int)(g[v].size()); i++) {       int w = g[v][i];       if (!used[w]) {         dfs(w, v);       }     }     if (v == 0) {       v = v;     }     int maxid = -1;     for (int i = 0; i < (int)(g[v].size()); i++) {       int w = g[v][i];       if (w != par) {         if (maxid == -1 || cnt(root[w]) > cnt(root[maxid])) maxid = w;       }     }     if (maxid != -1) {       link[v] = link[maxid];       root[v] = root[maxid];       for (int i = 0; i < (int)(g[v].size()); i++) {         int w = g[v][i];         if (w != par && w != maxid) {           intersect(v, w, root[w]);         }       }       if (lib[link[v]].find(color[v]) == lib[link[v]].end()) {         lib[link[v]][color[v]] = 1;         insert(make_pair(1, color[v]), rand(), root[v]);       } else {         erase(make_pair(lib[link[v]][color[v]], color[v]), root[v]);         lib[link[v]][color[v]]++;         insert(make_pair(lib[link[v]][color[v]], color[v]), rand(), root[v]);       }     } else {       root[v] = new node(make_pair(1, color[v]));       link[v] = v;       lib[link[v]][color[v]] = 1;     }     node *t1 = NULL, *t2 = NULL;     for (int i = 0; i < queries[v].size(); i++) {       int qid = queries[v][i];       split(root[v], make_pair(q[qid].second, 0), t1, t2);       ans[qid] = cnt(t2);       merge(root[v], t1, t2);     }   }   int main() {     cin >> n >> m;     init();     for (int i = 0; i < (int)(n); i++) cin >> color[i];     for (int i = 0; i < (int)(n - 1); i++) {       int a, b;       scanf( %d%d , &a, &b);       a--, b--;       g[a].push_back(b);       g[b].push_back(a);     }     for (int i = 0; i < (int)(m); i++) {       cin >> q[i].first >> q[i].second;       q[i].first--;       queries[q[i].first].push_back(i);     }     dfs(0, 0);     for (int i = 0; i < (int)(m); i++) printf( %d n , ans[i]);     return 0;   }