#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 800010;
int n, m, d, ans, tot, c[maxn], a[maxn], f[maxn][25], dep[maxn], res[maxn], dfn[maxn][2], p[maxn];
bool vis[maxn];
vector <int> g[maxn];
struct E {
int l, r, _lca, id;
} q[maxn];
bool cmp (E x, E y) { return (x.l / d == y.l / d ? x.r < y.r : x.l < y.l); }
void dfs (int x, int fa) {
dep[x] = dep[fa] + 1;
dfn[x][0] = ++tot;
a[tot] = c[x];
f[x][0] = fa;
for (int i = 1; i < 21; i++) {
f[x][i] = f[f[x][i - 1]][i - 1];
}
for (int y : g[x]) {
if (y != fa) dfs (y, x);
}
dfn[x][1] = ++tot;
}
void init () {
pair <int, int> b[maxn];
for (int i = 1; i <= n; i++) {
b[i].first = c[i];
b[i].second = i;
}
sort (b + 1, b + n + 1);
for (int i = 1, tmp = 0; i <= n; i++){
tmp ++ ;
// b[i].first != b[i - 1].first;
c[b[i].second] = tmp;
}
}
int Lca (int x, int y) {
if (dep[x] < dep[y]) swap (x, y);
for (int i = 18; i >= 0; i--) {
if (dep[f[x][i]] >= dep[y]) x = f[x][i];
}
if (x == y) return x;
for (int i = 18; i >= 0; i--) {
if (f[x][i] != f[y][i]) x = f[x][i], y = f[y][i];
}
return f[x][0];
}
void modify (int x) {
if (vis[x]) ans -= (--p[a[x]] == 0);
else ans += (++p[a[x]] == 1);
vis[x] ^= 1;
}
int main () {
ios::sync_with_stdio (false), cin.tie (0);
cin >> n >> m;
d = n * 2 / sqrt (m * 2 / 3);
for (int i = 1; i <= n; i++) {
cin >> c[i];
}
for (int i = 1; i < n; i++) {
int u, v; cin >> u >> v;
g[u].push_back (v);
g[v].push_back (u);
}
init ();
dfs (1, 1);
for (int i = 1; i <= m; i++) {
int l, r; cin >> l >> r;
if (l == r){
q[i] = E{dfn[l][0], dfn[l][0], 0, i};
continue;
}
if (dep[l] > dep[r]) swap (l, r);
int lca = Lca (l, r);
if (lca == l) q[i] = E{dfn[r][1], dfn[l][0], 0, i};
else {
if (dfn[l][1] < dfn[r][0]) q[i] = E{dfn[l][1], dfn[r][0], dfn[lca][0], i};
else q[i] = E{dfn[r][1], dfn[l][0], dfn[lca][0], i};
}
}
sort (q + 1, q + m + 1, cmp);
int l = 1, r = 0;
for (int i = 1; i <= m; i++) {
while (l < q[i].l) modify (l++);
while (l > q[i].l) modify (--l);
while (r < q[i].r) modify (++r);
while (r > q[i].r) modify (r--);
if (q[i]._lca) modify (q[i]._lca);
res[q[i].id] = ans;
if (q[i]._lca) modify (q[i]._lca);
}
for (int i = 1; i <= m; i++) cout << res[i] << '\n';
return 0;
}