#include<bits/stdc++.h>
using namespace std;
const int N=2e5+1;
int n,m,a[N],f[N][21],b[N],c[N],d[N]={0,1},dfn[N],s[N],t[N],u,v,cnt,sum,ans[N],blo,bel[N];
bool p[N];
struct node{
int x,y,lc,id;
}q[N];
vector<int>G[N];
bool cmp(node x,node y){
if(bel[x.x]!=bel[y.x]) return bel[x.x]<bel[y.x];
return bel[x.y]<bel[y.y];
}
void dfs(int u){
dfn[++cnt]=u,s[u]=cnt;
for(int i=1;i<=20;i++) f[u][i]=f[f[u][i-1]][i-1];
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(v==f[u][0]) continue;
d[v]=d[u]+1,f[v][0]=u;
dfs(v);
}
dfn[++cnt]=u,t[u]=cnt;
}
int lca(int x,int y){
if(d[x]<d[y]) swap(x,y);
for(int i=20;i>=0;i--) if(d[f[x][i]]>=d[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 build(){
blo=sqrt(n);
for(int i=1;i<=2*n;i++) bel[i]=(i-1)/blo+1;
}
void add(int x){
if(++b[a[x]]==1) sum++;
}
void del(int x){
if(!(--b[a[x]])) sum--;
}
void upd(int x){
if(p[x]) del(x);
else add(x);
p[x]^=1;
}
void modeque(){
int x=1,y=0;
for(int i=1;i<=m;i++){
for(;y<q[i].y;y++) upd(dfn[y+1]);
for(;y>q[i].y;y--) upd(dfn[y]);
for(;x<q[i].x;x++) upd(dfn[x]);
for(;x>q[i].x;x--) upd(dfn[x-1]);
if(q[i].lc) upd(dfn[q[i].lc]);
ans[q[i].id]=sum;
if(q[i].lc) upd(dfn[q[i].lc]);
}
}
int main(){
cin>>n>>m;
build();
for(int i=1;i<=n;i++) cin>>a[i],c[i]=a[i];
sort(c+1,c+1+n);
int mm=unique(c+1,c+1+n)-c-1;
for(int i=1;i<=n;i++) a[i]=lower_bound(c+1,c+1+mm,a[i])-c;
for(int i=1;i<n;i++){
cin>>u>>v;
G[u].push_back(v);
G[v].push_back(u);
}
dfs(1);
for(int i=1;i<=m;i++){
cin>>u>>v;
int lc=lca(u,v);
if(u==lc||v==lc){
if(s[u]>s[v]) swap(u,v);
q[i]={s[u],s[v],0,i};
}
else{
if(s[u]>t[v]) swap(u,v);
q[i]={t[u],s[v],lc,i};
}
}
sort(q+1,q+1+m,cmp);
modeque();
for(int i=1;i<=m;i++) cout<<ans[i]<<endl;
}