不知道哪里错了,呜呜呜,悬赏1个关注+5块
#include<bits/stdc++.h>
#define int long long
#define mid (l+r>>1)
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define len (r-l+1)
const int MAXN=1e5+5;
using namespace std;
struct node {
int rs,ls,sum;
}a[4000005];
int head[2000005],to[2000005],nxt[2000005],mod,tot;//编表
void add(int x,int y) {
to[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
int laz[4000005],res; //线段树板子
inline void pushdown(int rt,int l,int r){
laz[rt<<1]=laz[rt];
laz[rt<<1|1]=laz[rt];
a[rt<<1].ls=a[rt<<1].rs=laz[rt];
a[rt<<1|1].ls=a[rt<<1|1].rs=laz[rt];
a[rt<<1].sum=(mid-l);
a[rt<<1|1].sum=(r-mid-1);
laz[rt]=0;
}
inline void build(int rt,int l,int r){
if(l==r){
a[rt].ls=0; a[rt].rs=0; a[rt].sum=0;
return;
}
build(lson); build(rson);
}
node query(int rt,int l,int r,int L,int R){
if(L<=l&&r<=R){
return a[rt];
} else {
int flag=0;node w1,w2;
if(laz[rt])pushdown(rt,l,r);
if(L<=mid)flag++,w1=query(lson,L,R);
if(R>mid)flag+=2,w2=query(rson,L,R);
if(flag==1) return w1;
if(flag==2) return w2;
else {
return (node){w1.ls,w2.rs,w1.sum+w2.sum+(w1.rs==w2.ls)};
}
}
}
inline void update(int rt,int l,int r,int L,int R,int k){
if(L<=l&&r<=R){
a[rt]=(node){k,k,r-l};
laz[rt]=k;
} else{
if(laz[rt])pushdown(rt,l,r);
if(L<=mid)update(lson,L,R,k);
if(R>mid)update(rson,L,R,k);
a[rt]=(node){a[rt<<1].ls,a[rt<<1|1].rs,a[rt<<1].sum+a[rt<<1|1].sum+(a[rt<<1].rs==a[rt<<1|1].ls)};
}
}
int dep[MAXN],fa[MAXN],siz[MAXN],top[MAXN],son[MAXN],id[MAXN],cnt;//树链剖分板子
void dfs1(int x,int f) {
dep[x]=dep[f]+1;
fa[x]=f;
siz[x]=1;
for(int i=head[x];i;i=nxt[i]) {
if(to[i]==f) continue;
dfs1(to[i],x);
siz[x]+=siz[to[i]];
if(siz[to[i]]>siz[son[x]]) son[x]=to[i];
}
}
void dfs2(int x,int topf) {
top[x]=topf;
id[x]=++cnt;
if(!son[x]) return ;
dfs2(son[x],topf);
for(int i=head[x];i;i=nxt[i]) {
if(to[i]==fa[x] || to[i]==son[x]) continue;
dfs2(to[i],to[i]);
}
}
int n,m;
//查询
void urang(int x,int y,int k) {
while(top[x]!=top[y]) {
if(dep[top[x]]<dep[top[y]]) swap(x,y);
update(1,1,n,id[top[x]],id[x],k);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
update(1,1,n,id[x],id[y],k);
}
int qrang(int x,int y) {
node ans1=(node){0,0,0},ans2=(node){0,0,0},t;
while(top[x]!=top[y]) {
if(dep[top[x]]>dep[top[y]]) {
t=query(1,1,n,id[top[x]],id[x]);
ans1=(node){ans1.ls,t.ls,t.sum+ans1.sum+(ans1.rs==t.rs)};
x=fa[top[x]];
} else {
t=query(1,1,n,id[top[y]],id[y]);
ans2=(node){t.ls,ans2.rs,t.sum+ans2.sum+(t.rs==ans1.ls)};
y=fa[top[y]];
}
}
if(dep[x]>dep[y]) {
t=query(1,1,n,id[y],id[x]);
ans1=(node){ans1.ls,t.ls,t.sum+ans1.sum+(ans1.rs==t.rs)};
} else {
t=query(1,1,n,id[x],id[y]);
ans2=(node){t.ls,ans2.rs,t.sum+ans2.sum+(t.rs==ans1.ls)};
}
return ans1.sum+ans2.sum+(ans1.rs==ans2.ls);
}
signed main(){
int t,change=0;
scanf("%d",&t);
while(t--) {
tot=0;cnt=0;change=0;
memset(head,0,sizeof head);
memset(to,0,sizeof to);
memset(nxt,0,sizeof nxt);
memset(laz,0,sizeof laz);
memset(dep,0,sizeof dep);
memset(son,0,sizeof son);
memset(id,0,sizeof id);
scanf("%d %d",&n,&m);
for(int i=1;i<n;i++) {
int x,y;
scanf("%d %d",&x,&y);
add(x,y);add(y,x);
}
dfs1(1,0);
dfs2(1,1);
build(1,1,n);
for(int i=1;i<=n;i++)update(1,1,n,id[i],id[i],-id[i]);
for(int i=1;i<=m;i++) {
int tmp,x,y;
scanf("%d",&tmp);
if(tmp==1) {
scanf("%d %d",&x,&y);
urang(x,y,++change);
} else {
scanf("%d %d",&x,&y);
printf("%d\n",qrang(x,y));
}
}
}
return 0;
}