rt,THX
#include<bits/stdc++.h>
using namespace std;
const int maxn=4e4+10;
struct edge {
int v,next;
}e[maxn<<1];
struct Query {
int l,r,bel,id,Lca;
}q[maxn*20];
bool cmp(Query a,Query b) {
if(a.bel!=b.bel) {
return a.bel<b.bel;
}
return a.r<b.r;
}
int cnt,h[maxn],cur,euler[maxn<<1],n,m,v[maxn],num[maxn],tmp[maxn],app[maxn],f[maxn][21],dep[maxn],ans[maxn],st[maxn],ed[maxn];
void addedge(int u,int v) {
e[++cnt].v=v;
e[cnt].next=h[u];
h[u]=cnt;
}
void insert(int u,int v) {
addedge(u,v);
addedge(v,u);
}
void dfs(int u,int fa) {
euler[++cnt]=u;
st[u]=cnt;
for(int i=h[u];i;i=e[i].next) {
int v=e[i].v;
if(v!=fa) {
dep[v]=dep[u]+1;
f[v][0]=u;
dfs(v,u);
}
}
euler[++cnt]=u;
ed[u]=cnt;
}
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];
}
}
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 mod(int y,int pos) {
y=v[y];
if(app[euler[pos]]==1) {
num[y]--;
app[euler[pos]]--;
if (num[y] == 0)
cur--;
}
else {
num[y]++;
app[euler[pos]]++;
if (num[y] == 1)
cur++;
}
}
int main() {
freopen("in.txt","r",stdin);
scanf("%d%d",&n,&m);
int block=sqrt(n);
for(int i=1;i<=n;i++) {
scanf("%d",&v[i]);
tmp[i]=v[i];
}
sort(tmp+1,tmp+n+1);
int k=unique(tmp+1,tmp+n+1)-tmp-1;
for(int i=1;i<=n;i++)
v[i]=lower_bound(tmp+1,tmp+k+1,v[i])-tmp;
for(int i=1;i<n;i++) {
int a,b;
scanf("%d%d",&a,&b);
insert(a,b);
}
cnt=0;
dfs(1,0);
for(int i=1;i<=18;i++) {
for(int j=1;j<=n;j++) {
f[j][i]=f[f[j][i-1]][i-1];
}
}
cnt=0;
for(int i=1;i<=m;i++) {
int a,b;
scanf("%d%d",&a,&b);
if(dep[a]<dep[b]) {
swap(b,a);
}
int LCA=lca(a,b);
if(LCA==b) {
q[i].l=st[b];
q[i].r=st[a];
q[i].bel=(q[i].l+1)/block+1;
q[i].id=i;
q[i].Lca=-1;
}
else {
if(ed[b]>st[a]) {
swap(a,b);
}
q[i].l=ed[b];
q[i].r=st[a];
q[i].bel=(q[i].l+1)/block+1;
q[i].id=i;
q[i].Lca=LCA;
}
}
sort(q+1,q+m+1,cmp);
/*for(int i=1;i<=n*2;i++) {
cout<<euler[i]<<" ";
}*/
int ll=1,rr=0;
for(int i=1;i<=m;i++) {
while(ll<q[i].l) {
mod(euler[ll],ll);
ll++;
}
while(ll>q[i].l) {
mod(euler[ll-1],ll-1);
ll--;
}
while(rr<q[i].r) {
mod(euler[rr+1],rr+1);
rr++;
}
while(rr>q[i].r) {
mod(euler[rr],rr);
rr--;
}
if(q[i].Lca&&num[v[q[i].Lca]]==0) {
ans[q[i].id]=cur+1;
}
else
ans[q[i].id]=cur;
}
for(int i=1;i<=m;i++) {
printf("%d\n",ans[i]);
}
return 0;
}
//1 4 8 8 4 3 7 7 6 6 5 5 3 2 2 1