rt,Wa第一个点。
求救,急!
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#define N 200200
#define Logn 30
#define mod 998244353
#define ll long long
#define Inf 0x3f3f3f3f
using namespace std;
inline int read(){
register int d=0,f=1;char ch = getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){d = (d<<1)+(d<<3)+(ch^48);ch = getchar();}
return d*f;
}
inline int max(const int &a,const int &b){return a>b?a:b;}
inline int min(const int &a,const int &b){return a<b?a:b;}
inline int swap(int &x,int &y){x^=y^=x^=y;}
int head[N],ecnt;
int n,m,cnt[N],vis[N],belong[N],first[N],last[N],ans[N],b[N],a[N],curL,curR,now,siz,bcnt;
int ncnt,lg[N],ord[N],dep[N],fa[N][Logn];
struct Edge{
int v,nxt;
}edge[N<<1];
struct Query{
int l,r,lca,id;
}que[N];
void init(int n){lg[0]=0;for(int i=1;i<=n;i++) lg[i]=lg[i-1]+((1<<lg[i-1])==i);}
inline void add(int u,int v){
edge[++ecnt].v=v;
edge[ecnt].nxt=head[u];
head[u]=ecnt;
}
inline bool cmp(Query a,Query 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);
}
void dfs(int u,int f){
ord[++ncnt]=u;
first[u]=ncnt;
fa[u][0]=f;dep[u]=dep[f]+1;
for(int i=1;i<=lg[dep[u]];i++){
fa[u][i]=fa[fa[u][i-1]][i-1];
}
for(int i=head[u];i;i=edge[i].nxt){
if(edge[i].v!=f) dfs(edge[i].v,u);
}
ord[++ncnt]=u;
last[u]=ncnt;
return;
}
int LCA(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
while(dep[x]>dep[y]){x=fa[x][lg[dep[x]-dep[y]]-1];}
if(x==y) return x;
for(int k=lg[dep[x]]-1;k>=0;k--){
if(fa[x][k]!=fa[y][k]) x=fa[x][k],y=fa[y][k];
}
return fa[x][0];
}
inline void update(int x){
vis[x]?now-=!--cnt[b[x]]:now+=!cnt[b[x]]++;vis[x]^=1;
}
signed main(){
n=read(),m=read();
for(int i=1;i<=n;i++) a[i]=b[i]=read();
sort(a+1,a+n+1);
int tot=unique(a+1,a+n+1)-a-1;
for(int i=1;i<=n;i++) b[i]=lower_bound(a+1,a+tot+1,b[i])-a;
for(int i=1;i<n;i++){
int x=read(),y=read();
add(x,y),add(y,x);
}
dep[1]=1;
init(n);dfs(1,0);
siz=sqrt(ncnt),bcnt=ceil(double(ncnt)/siz);
for(int i=1;i<=bcnt;i++){
for(int j=siz*(i-1)+1;j<=i*siz;j++) belong[j]=i;
}
for(int i=1;i<=m;i++){
int l=read(),r=read(),lca=LCA(l,r);
if(first[l]>first[r]) swap(l,r);
if(l==lca){que[i].l=first[l];que[i].r=first[r];que[i].lca=0;}
else{que[i].l=last[l];que[i].r=first[r];que[i].lca=lca;}
que[i].id=i;
}
sort(que+1,que+m+1,cmp);
curL=1,curR=0;
for(int i=1;i<=m;i++){
int ql=que[i].l,qr=que[i].r,lca=que[i].lca;
while(curL<ql) update(ord[curL++]);
while(curL>ql) update(ord[--curL]);
while(curR<qr) update(ord[++curR]);
while(curR>qr) update(ord[curR--]);
if(lca) update(lca);
ans[que[i].id]=now;
if(lca) update(lca);
}
for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
return 0;
}