#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], _dfn[maxn], 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;
_dfn[tot] = 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;
_dfn[tot] = x;
}
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 = 20; i >= 0; i--) {
if (dep[f[x][i]] >= dep[y]) x = f[x][i];
}
if (x == y) return x;
for (int i = 20; 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[c[x]] == 1), p[c[x]]--;
else ans += (p[c[x]] == 0), p[c[x]]++;
vis[x] ^= 1;
}
int main () {
ios::sync_with_stdio (false), cin.tie (0);
cin >> n >> m;
d = max (1, (int)sqrt(n * 2));
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, 0);
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 (dfn[l][0] > dfn[r][0]) swap (l, r);
int lca = Lca (l, r);
if (lca == l) q[i] = E{dfn[r][1], dfn[l][0], 0, i};
else if (lca == r) q[i] = E{dfn[l][1], dfn[r][0], 0, i};
else q[i] = E{dfn[l][1], dfn[r][0], lca, 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 (_dfn[l++]);
while (l > q[i].l) modify (_dfn[--l]);
while (r < q[i].r) modify (_dfn[++r]);
while (r > q[i].r) modify (_dfn[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;
}