#include <iostream>
#include <cstdio>
#include <algorithm>
#include <stdlib.h>
#include <cstring>
#include <vector>
#include <cmath>
#define N 40005
#define M 100005
using namespace std;
int seq[N << 1],n,m,cnt,dep[N],fa[N][25],c[N],col[N],b[N],cntp,st[N],ed[N],len,ans[M],now_ans;
bool vis[N];
int mp[N];
vector<int> g[N];
int getid(int x) {
int l = 1,r = cntp,res = 1;
while(l <= r) {
int mid = l + r >> 1;
if (c[mid] >= x) res = mid,r = mid - 1;
else l = mid + 1;
}
return res;
}
void dfs0(int cur,int father) {
seq[++cnt] = cur;
st[cur] = cnt;
dep[cur] = dep[father] + 1;
fa[cur][0] = father;
for (auto i : g[cur])
if (i != father)
dfs0(i,cur);
seq[++cnt] = cur;
ed[cur] = cnt;
}
struct node{
int id,l,r,pos,x;
}q[M];
int LCA(int x,int y) {
if (dep[x] < dep[y]) x ^= y ^= x ^= y;
for (int j = 20;j >= 0;j --)
if (dep[fa[x][j]] >= dep[y]) x = fa[x][j];
if (x == y) return x;
for (int j = 20;j >= 0;j --)
if (fa[x][j] != fa[y][j]) x = fa[x][j],y = fa[y][j];
return fa[x][0];
}
void update(int x) {
if (vis[x]) {
vis[x] = 0;
mp[col[x]] --;
if (mp[col[x]] == 0) now_ans --;
}
else {
vis[x] = 1;
mp[col[x]] ++;
if (mp[col[x]] == 1) now_ans ++;
}
}
signed main(){
cin >> n >> m;
len = ceil(n / sqrt(m));
for (int i = 1;i <= n;i ++) cin >> col[i],b[i] = col[i];
stable_sort(b + 1,b + 1 + n);
for (int i = 1;i <= n;i ++)
if (b[i] != b[i - 1])
c[++cntp] = b[i];
for (int i = 1;i <= n;i ++) col[i] = getid(col[i]);
for (int i = 1,u,v;i < n;i ++) {
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
dfs0(1,0);
for (int j = 1;j <= 20;j ++)
for (int i = 1;i <= n;i ++)
fa[i][j] = fa[fa[i][j - 1]][j - 1];
for (int i = 1;i <= m;i ++) {
q[i].id = i;
int u,v;
cin >> u >> v;
int lca = LCA(u,v);
if (u == lca || v == lca) {
if (st[v] < st[u]) u ^= v ^= u ^= v;
q[i].l = st[u],q[i].r = st[v];
}
else {
if (st[v] < ed[u]) u ^= v ^= u ^= v;
q[i].l = ed[u],q[i].r = st[v],q[i].x = lca;
}
q[i].pos = q[i].l / len;
}
stable_sort(q + 1,q + 1 + m,[](node x,node y) {
if (x.pos == y.pos) return (x.pos & 1) ? x.r > y.r : x.r < y.r;
return x.pos < y.pos;
});
for (int i = 1,l = 1,r = 0;i <= m;i ++) {
int ql = q[i].l,qr = q[i].r;
while (l < ql) update(seq[l ++]);
while (l > ql) update(seq[++l]);
while (r < qr) update(seq[++r]);
while (r > qr) update(seq[r --]);
if (q[i].x) update(q[i].x);
ans[q[i].id] = now_ans;
if (q[i].x) update(q[i].x);
}
for (int i = 1;i <= m;i ++) cout << ans[i] << endl;
return 0;
}