//不等,不问,不犹豫,不回头.
#include<bits/stdc++.h>
#define _ 0
#define db double
#define RE register
#define ll long long
#define P 1000000007
#define INF 1000000000
#define get(x) x=read()
#define PLI pair<ll,int>
#define PII pair<int,int>
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#define pb(x) push_back(x)
#define ull unsigned long long
#define put(x) printf("%d\n",x)
#define putl(x) printf("%lld\n",x)
#define rep(i,x,y) for(RE int i=x;i<=y;++i)
#define fep(i,x,y) for(RE int i=x;i>=y;--i)
#define go(x) for(int i=link[x],y=a[i].y;i;y=a[i=a[i].next].y)
using namespace std;
const int N=40010,M=1e5+10;
int link[N],tot,n,m,b[N],d[N],ct,ou[N<<1],num,first[N],last[N],f[N][25],deep[N];
int cnt[N],vis[N],c[M],belong[N],block,now;
struct edge{int y,next;}a[N<<1];
struct wy{int l,r,id,lc;}q[M];
inline int read()
{
int x=0,ff=1;
char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') ff=-1;ch=getchar();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*ff;
}
inline int find(int x){return lower_bound(b+1,b+ct+1,x)-b;}
inline void add(int x,int y)
{
a[++tot].y=y;a[tot].next=link[x];link[x]=tot;
a[++tot].y=x;a[tot].next=link[y];link[y]=tot;
}
inline void dfs(int x,int fa)
{
ou[++num]=x;first[x]=num;
go(x)
{
if(y==fa) continue;
deep[y]=deep[x]+1;
f[y][0]=x;
rep(j,1,20) f[y][j]=f[f[y][j-1]][j-1];
dfs(y,x);
}
ou[++num]=x;last[x]=num;
}
inline int lca(int a,int b)
{
if(deep[a]>deep[b]) swap(a,b);
fep(i,20,0) if(deep[f[b][i]]>=deep[a]) b=f[b][i];
if(a==b) return a;
fep(i,20,0) if(f[a][i]!=f[b][i]) a=f[a][i],b=f[b][i];
return f[a][0];
}
inline bool cmp(wy a,wy b)
{
return (belong[a.l]^belong[b.l]?belong[a.l]<belong[b.l]:(belong[a.l]&1?a.r<b.r:a.r>b.r));
}
inline void work(int x)
{
if(vis[x]){cnt[d[x]]--;if(!cnt[d[x]]) now--;}
else{if(!cnt[d[x]]) now++;cnt[d[x]]++;}
vis[x]^=1;
}
inline void build()
{
block=sqrt(n<<1);
rep(i,1,n<<1) belong[i]=(i-1)/block+1;
}
int main()
{
//freopen("1.in","r",stdin);
get(n);get(m);
build();
rep(i,1,n) get(d[i]),b[i]=d[i];
sort(b+1,b+n+1);
ct=unique(b+1,b+n+1)-b-1;
rep(i,1,n-1)
{
int get(x),get(y);
add(x,y);
}
deep[1]=1;dfs(1,0);
rep(i,1,m)
{
int get(l),get(r),lc=lca(l,r);
if(first[l]>first[r]) swap(l,r);
if(lc==l)
{
q[i].l=first[l];
q[i].r=first[r];
}
else
{
q[i].l=last[l];
q[i].r=first[r];
q[i].lc=lc;
}
q[i].id=i;
}
sort(q+1,q+m+1,cmp);
int l=1,r=0;
rep(i,1,m)
{
int ql=q[i].l,qr=q[i].r,lc=q[i].lc;
while(l<ql) work(ou[l++]);
while(l>ql) work(ou[--l]);
while(r<qr) work(ou[++r]);
while(r>qr) work(ou[r--]);
if(lc) work(lc);
c[q[i].id]=now;
if(lc) work(lc);
}
rep(i,1,m) put(c[i]);
return (0^_^0);
}
//以吾之血,祭吾最后的亡魂
疯狂CE,求助大佬...