我的fhq_treap的做法,除了第一个点其他的全部WA了,求助
```cpp
#include<cstdio>
#include<algorithm>
#define N 214514
using namespace std;
int seed,md=19260817;
void _srand(int x){seed=x;}
int _rand(){seed=((seed*7)%md+13)%md;return seed;}
int n,m,rt;
struct fhq_treap{
int ch[N][2],tag[N],rnd[N],siz[N],tot,sum[N];
int lx0[N],x0[N],rx0[N];
bool val[N];
#define lc ch[x][0]
#define rc ch[x][1]
int update(int x){
sum[x]=sum[lc]+sum[rc]+val[x];
siz[x]=siz[lc]+siz[rc]+1;
x0[x]=max(x0[lc],x0[rc]);
lx0[x]=lx0[lc];
rx0[x]=rx0[rc];
if(val[x]==0){
x0[x]=max(x0[x],rx0[lc]+1+lx0[rc]);
if(siz[lc]==lx0[lc])lx0[x]=lx0[lc]+1+lx0[rc];
if(siz[rc]==rx0[rc])rx0[x]=rx0[rc]+1+rx0[lc];
}
return x;
}
void assign(int x,int v){
tag[x]=v;
if(v==0)x0[x]=lx0[x]=rx0[x]=siz[x];
val[x]=v;
}
void pushdown(int x){
if(tag[x]!=-1){
if(lc)assign(lc,tag[x]);
if(rc)assign(rc,tag[x]);
tag[x]=-1;
}
}
void split(int p,int k,int &x,int &y){
if(!p)return void(x=y=0);
if(k>siz[ch[p][0]])pushdown(p),split(ch[x=p][1],k-siz[ch[p][0]]-1,ch[p][1],y);
else pushdown(p),split(ch[y=p][0],k,x,ch[p][0]);
update(p);
}
int merge(int x,int y){
if(!x||!y)return x+y;
if(rnd[x]<rnd[y]){pushdown(x),pushdown(y),rc=merge(rc,y);return update(x);}
else{pushdown(x),pushdown(y),ch[y][0]=merge(x,ch[y][0]);return update(y);}
}
int newnode(int v){
val[++tot]=v;
rnd[tot]=_rand();
sum[tot]=v;siz[tot]=1;
if(v==0)x0[tot]=lx0[tot]=rx0[tot]=1;
tag[tot]=-1;
return tot;
}
void print(int x){
pushdown(x);
if(lc)print(lc);
printf("%d ",val[x]);
if(rc)print(rc);
}
}st;
signed main(){
_srand(114514);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)rt=st.merge(rt,st.newnode(1));
while(m--){
int op;
scanf("%d",&op);
if(op==0){
int l,r;
scanf("%d%d",&l,&r);
int x,y,a,b;
st.split(rt,r,x,y);
st.split(x,l-1,a,b);
st.assign(b,0);
rt=st.merge(st.merge(a,b),y);
}else if(op==1){
int l0,r0,l1,r1;
scanf("%d%d%d%d",&l0,&r0,&l1,&r1);
int x,y,a,b,c,d,e,f,g,h;
st.split(rt,r0,x,y);
st.split(x,l0-1,a,b);
int v=st.sum[b];
if(r1<l0){
st.split(a,r1,c,d);
st.split(c,l1-1,e,f);
int v2=st.sum[f];
int v3=min(v+v2,r1-l1+1);
st.split(f,v3,g,h);
st.assign(g,1);
st.assign(b,0);
f=st.merge(g,h);
c=st.merge(e,f);
a=st.merge(c,d);
x=st.merge(a,b);
rt=st.merge(x,y);
}else{
st.split(y,r1-r0,c,d);
st.split(c,l1-r0-1,e,f);
int v2=st.sum[f];
int v3=min(v+v2,r1-l1+1);
st.split(f,v3,g,h);
st.assign(g,1);
st.assign(b,0);
f=st.merge(g,h);
c=st.merge(e,f);
y=st.merge(c,d);
x=st.merge(a,b);
rt=st.merge(x,y);
}
}else{
int l,r;
scanf("%d%d",&l,&r);
int x,y,a,b;
st.split(rt,r,x,y);
st.split(x,l-1,a,b);
printf("%d\n",st.x0[b]);
rt=st.merge(st.merge(a,b),y);
}
//st.print(rt);
//puts("");
}
return 0;
}
```
by 黑影洞人 @ 2022-12-20 11:37:55