#include <bits/stdc++.h>
#define maxn 1010010
using namespace std;
struct EDGE{
int nxt, to;
}e[maxn];
int head[maxn], cnt;
inline void add(int a,int b){e[++cnt].nxt = head[a], e[cnt].to = b, head[a] = cnt;}
int dep[maxn], fa[maxn][32], lg[maxn];
int dfn[maxn], low[maxn], mp[maxn], tim;
inline void dfs(int u,int f){
dfn[u] = ++tim, mp[tim] = u;
dep[u] = dep[f] + 1, fa[u][0] = f;
for(int i = 1; i <= 28; i++) fa[u][i] = fa[fa[u][i - 1]][i - 1];
for(int i = head[u]; i; i = e[i].nxt) if(e[i].to != f) dfs(e[i].to, u);
low[u] = ++tim, mp[tim] = u;
}
inline int LCA(int x,int y){
if(dep[x] < dep[y]) swap(x, y);
while(dep[x] > dep[y]) x = fa[x][lg[dep[x] - dep[y]] - 1];
if(x == y) return x;
for(int k = 28; k; k--) if(fa[x][k] != fa[y][k]) x = fa[x][k], y = fa[x][k];
return fa[x][0];
}
struct ask{
int ql, qr, qtim, lca;
}q[maxn];
int blo, bl[maxn], tot[maxn], col[maxn], bcol[maxn], sum, ans, w[maxn], n, m, l = 1, r;
inline bool cmp(ask a, ask b){
if(bl[a.ql] < bl[b.ql]) return true;
if(bl[a.ql] > bl[b.ql]) return false;
return a.qr < b.qr;
}
inline void add(int k){
if(!tot[col[k]]) ans++;
tot[col[k]]++;
}
inline void del(int k){
tot[col[k]]--;
if(!tot[col[k]])ans--;
}
int vis[maxn];
inline void change(int k){
vis[k] ? del(k) : add(k);
vis[k] ^= 1;
}
int main(){
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n >> m;
blo = sqrt(n);
for(int i = 1; i < maxn; i++) lg[i] = lg[i >> 1] + 1;
for(int i = 1; i <= n; i++) cin >> col[i], bl[i] = (i - 1) / blo + 1, bcol[i] = col[i];
sort(bcol + 1, bcol + 1 + n);
sum = unique(bcol + 1, bcol + 1 + n) - bcol - 1;
for(int i = 1; i <= n; i++) col[i] = lower_bound(bcol + 1, bcol + 1 + sum, col[i]) - bcol;
for(int i = 1, u, v; i <= n - 1; i++) cin >> u >> v, add(u, v), add(v, u);
dfs(1, 0);
for(int i = 1, u, v; i <= m; i++) {
cin >> u >> v, q[i].qtim = i, q[i].lca = LCA(u, v);
if(dfn[u] > dfn[v]) swap(u, v);
if(u == q[i].lca) q[i].ql = dfn[u], q[i].lca = 0;
else q[i].ql = low[u];
q[i].qr = dfn[v];
}
sort(q + 1, q + 1 + m, cmp);
for(int i = 1; i <= m; i++){
int ql = q[i].ql, qr = q[i].qr, qtim = q[i].qtim, lca = q[i].lca;
while(r < qr) change(mp[++r]);
while(l > ql) change(mp[--l]);
while(r > qr) change(mp[r--]);
while(l < ql) change(mp[l++]);
if(lca) change(lca);
w[qtim] = ans;
if(lca) change(lca);
}
for(int i = 1; i <= m; i++) cout << w[i] << '\n';
return 0;
}