RT,本地能编译的
#include<bits/stdc++.h>
#define eps 1e-10
#define re register
#define N 201001
#define MAX 2001
#define inf 1e18
using namespace std;
typedef long long ll;
typedef double db;
inline void read(re ll &ret)
{
ret=0;re ll pd=0;re char c=getchar();
while(!isdigit(c)){pd|=c=='-';c=getchar();}
while(isdigit(c)){ret=(ret<<1)+(ret<<3)+(c^48);c=getchar();}
ret=pd?-ret:ret;
}
ll n,m,x,y,a[N],st[N],ed[N],cnt,lis[N],dep[N],son[N],siz[N],top[N],f[N],b[N],zxq,len,p[N],now,num[N];
vector<ll>v[N];
bool vst[N];
inline void dfs1(re ll ver,re ll fa)
{
f[ver]=fa;
dep[ver]=dep[fa]+1;
siz[ver]=1;
for(re int i=0;i<v[ver].size();i++)
{
re ll to=v[ver][i];
if(to==fa)
continue;
dfs1(to,ver);
siz[ver]+=siz[to];
if(siz[to]>siz[son[ver]])
son[ver]=to;
}
return;
}
inline void dfs2(re ll ver,re ll fa,re ll tp)
{
top[ver]=tp;
st[ver]=++cnt;
lis[cnt]=ver;
if(son[ver])
dfs2(son[ver],ver,tp);
for(re int i=0;i<v[ver].size();i++)
{
re ll to=v[ver][i];
if(to==fa||to==son[ver])
continue;
dfs2(to,ver,to);
}
ed[ver]=++cnt;
lis[cnt]=ver;
return;
}
inline ll lca(re ll x,re ll y)
{
while(top[x]^top[y])
{
if(dep[top[x]]<dep[top[y]])
swap(x,y);
x=f[top[x]];
}
if(dep[x]>dep[y])
swap(x,y);
return x;
}
struct query
{
ll l,r,t,ans,lca;
inline friend operator <(re query x,re query y)
{
if(p[x.l]==p[y.l])
return x.r<y.r;
return p[x.l]<p[y.l];
}
}q[N];
inline bool cmp(re query x,re query y)
{
return x.t<y.t;
}
inline void add(re ll pos)
{
num[a[pos]]++;
if(num[a[pos]]==1)
now++;
return;
}
inline void del(re ll pos)
{
num[a[pos]]--;
if(!num[a[pos]])
now--;
return;
}
int main()
{
read(n);
read(m);
len=(n<<1)/sqrt(m)+1;
for(re int i=1;i<=n;i++)
read(a[i]),b[i]=a[i];
sort(b+1,b+n+1);
zxq=unique(b+1,b+n+1)-b-1;
for(re int i=1;i<=n;i++)
a[i]=lower_bound(b+1,b+zxq+1,a[i])-b;
for(re int i=1;i<n;i++)
{
read(x);
read(y);
v[x].push_back(y);
v[y].push_back(x);
}
dfs1(1,0);
dfs2(1,0,1);
for(re int i=1;i<=m;i++)
{
read(x);
read(y);
re ll tmp=lca(x,y);
if(dep[x]>dep[y])
swap(x,y);
q[i].t=i;
q[i].ans=0;
q[i].lca=tmp;
if(tmp==x)
q[i].l=st[x],q[i].r=st[y];
else
{
if(st[x]>st[y])
swap(x,y);
q[i].l=ed[x],q[i].r=st[y];
}
}
for(re int i=1;i<=(n<<1);i++)
p[i]=(i-1)/len+1;
sort(q+1,q+m+1);
re ll l=2,r=1;
for(re int i=1;i<=m;i++)
{
while(l>q[i].l)
{
l--;
if(!vst[lis[l]])
add(lis[l]);
else
del(lis[l]);
vst[lis[l]]^=1;
}
while(l<q[i].l)
{
if(!vst[lis[l]])
add(lis[l]);
else
del(lis[l]);
vst[lis[l]]^=1;
l++;
}
while(r>q[i].r)
{
if(!vst[lis[r]])
add(lis[r]);
else
del(lis[r]);
vst[lis[r]]^=1;
r--;
}
while(r<q[i].r)
{
r++;
if(!vst[lis[r]])
add(lis[r]);
else
del(lis[r]);
vst[lis[r]]^=1;
}
add(q[i].lca);
q[i].ans=now;
del(q[i].lca);
}
sort(q+1,q+m+1,cmp);
for(re int i=1;i<=m;i++)
printf("%lld\n",q[i].ans);
exit(0);
}