#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
const int N=4e4+5;
int n,m,h[N],a[N],ans[N],b[N],id=0;
int st[N],ed[N],w[N<<1],d[N],vis[N],cnt=0;
int fa[N],siz[N],tops[N],dep[N],son[N],res=0;
struct node{int to,ne;}e[N<<1];
struct Que{int l,r,L,R,id,lca;}q[N*5];
bool cmp(Que x,Que y){
if(x.L==y.L) return x.R<y.R;
return x.L<y.L;
}
void add(int a,int b){
e[++id]={b,h[a]};
h[a]=id;
}
void dfs1(int x,int f){
w[++cnt]=x,st[x]=cnt;
fa[x]=f;
dep[x]=dep[f]+1;
siz[x]=1;
int maxson=-1;
for(int i=h[x];i;i=e[i].ne){
int y=e[i].to;
if(y==f) continue;
dfs1(y,x);
siz[x]+=siz[y];
if(maxson<siz[y]) son[x]=y,maxson=siz[y];
}
w[++cnt]=x,ed[x]=cnt;
}
void dfs2(int x,int topf){
tops[x]=topf;
if(!son[x]) return ;
dfs2(son[x],topf);
for(int i=h[x];i;i=e[i].ne){
int y=e[i].to;
if(y==fa[x]||y==son[x]) continue;
dfs2(y,y);
}
}
int LCA(int x,int y){
while(tops[x]!=tops[y]){
if(dep[tops[x]]<dep[tops[y]]) swap(x,y);
x=fa[tops[x]];
}
return dep[x]<dep[y]?x:y;
}
void add(int x){if(!d[a[x]])++res;++d[a[x]];}
void del(int x){--d[a[x]];if(!d[a[x]])--res;}
void use(int x){
if(vis[x]) del(x),vis[x]=0;
else add(x),vis[x]=1;
}
int main(){
scanf("%d%d",&n,&m);
int len=sqrt(2*n);
for(int i=1;i<=n;++i) scanf("%d",&a[i]),b[i]=a[i];
sort(b+1,b+n+1);
int num=unique(b+1,b+n+1)-b-1;
for(int i=1;i<=n;++i) a[i]=lower_bound(b+1,b+num+1,a[i])-b;
for(int i=1;i<n;++i){
int u,v;
scanf("%d%d",&u,&v);
add(u,v);add(v,u);
}
dfs1(1,0),dfs2(1,1);
for(int i=1;i<=m;++i){
int x,y;
scanf("%d%d",&x,&y);
if(st[x]>st[y]) swap(x,y);
q[i].lca=LCA(x,y);
q[i].id=i;
if(q[i].lca==x){
q[i].l=st[x];
q[i].r=st[y];
q[i].L=q[i].l/len;
q[i].R=q[i].r/len;
q[i].lca=-1;
}
else{
q[i].l=ed[x];
q[i].r=st[y];
q[i].L=q[i].l/len;
q[i].R=q[i].r/len;
}
}
sort(q+1,q+m+1,cmp);
int L=0,R=1;
for(int i=1;i<=m;++i){
while(L>q[i].l) use(w[--L]);
while(R<q[i].r) use(w[++R]);
while(L<q[i].l) use(w[L++]);
while(R>q[i].r) use(w[R--]);
if(q[i].lca!=-1) use(q[i].lca);
ans[q[i].id]=res;
if(q[i].lca!=-1) use(q[i].lca);
}
for(int i=1;i<=m;++i) printf("%d\n",ans[i]);
}