树上莫队写了一下午,交上去就这样了,rt
#include<bits/stdc++.h>
#include<cmath>
#define ll long long
#define N 200010
using namespace std;
int head[N],to[N],nxt[N],tot=0;
int st[N],ed[N],dfn[N],cnt=0,siz[N],f[N],son[N],top[N],dep[N];
int n,m,q;
int val[N],val2[N],date[N];
int id[N],len;
ll read(){
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
void add(int u,int v){
to[++tot]=v;
nxt[tot]=head[u];
head[u]=tot;
}
void dfs1(int u,int fa,int deep){
dep[u]=deep;
f[u]=fa;
dfn[++cnt]=u;
st[u]=cnt;
siz[u]=1;
int maxson=-1;
for(int i=head[u];i;i=nxt[i]){
int v=to[i];
if(v==fa) continue;
dfs1(v,u,deep+1);
siz[u]+=siz[v];
if(siz[v]>maxson){
maxson=siz[v];
son[u]=v;
}
}
dfn[++cnt]=u;
ed[u]=cnt;
}
void dfs2(int u,int topf){
top[u]=topf;
if(!son[u]) return;
dfs2(son[u],topf);
for(int i=head[u];i;i=nxt[i]){
int v=to[i];
if(v==son[u] || v==f[u]) continue;
dfs2(v,v);
}
}
int lca(int x,int 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]) return x;
else return y;
}
struct node{
int l,r,LF,ID,ans;
}a[N];
bool cmp(node x,node y){
if(id[x.l]==id[y.l]){
if(id[x.l]&1) return x.r>y.r;
else return x.r<y.r;
}else return id[x.l]<id[y.l];
}
void delquery(){
for(int i=1;i<=q;i++){
int x=read(),y=read();
if(st[x]>st[y]) swap(x,y);
int fu=lca(x,y);
a[i].ID=i;
if(fu==x) a[i].l=st[x],a[i].r=st[y];
else a[i].l=ed[x],a[i].r=st[y],a[i].LF=fu;
}
sort(a+1,a+q+1,cmp);
}
int Ans,out[N],used[N],happen[N];
void add(int x){
happen[x]++;
if(happen[x]==1) Ans++;
}
void del(int x){
happen[x]--;
if(happen[x]==0) Ans--;
}
void Add(int x){
if(used[x]) del(date[x]);
else add(date[x]);
used[x]^=1;
}
void MO(){
int L=1,R=0;
for(int i=1;i<=q;i++){
while(L<a[i].l){
Add(dfn[L]);
L++;
}
while(L>a[i].l){
L--;
Add(dfn[L]);
}
while(R<a[i].r){
R++;
Add(dfn[R]);
}
while(R>a[i].r){
Add(dfn[R]);
R--;
}
if(a[i].LF) Add(a[i].LF);
a[i].ans=Ans;
if(a[i].LF) Add(a[i].LF);
}
for(int i=1;i<=q;i++) out[a[i].ID]=a[i].ans;
for(int i=1;i<=q;i++) cout<<out[i]<<endl;
}
int main()
{
n=read(),q=read();
for(int i=1;i<=n;i++) val[i]=read(),val2[i]=val[i];
sort(val2+1,val2+n+1);
m=unique(val2+1,val2+n+1)-val2-1;
for(int i=1;i<=n;i++) date[i]=lower_bound(val2+1,val2+m+1,val[i])-val2;
len=sqrt(2*n);
for(int i=1;i<=2*n;i++) id[i]=(i-1)/len+1;
for(int i=1;i<n;i++){
int u=read(),v=read();
add(u,v);
add(v,u);
}
dfs1(1,0,1);
dfs2(1,1);
//for(int i=1;i<=2*n;i++) cout<<dfn[i]<<' ';
delquery();
MO();
return 0;
}