自己造了几组小样例,都对了
#include <iostream>
#define lc(x) son[x][0]
#define rc(x) son[x][1]
#define rnk(x) (siz[son[x][0]]+1)
#define int long long
using namespace std;
const int N=5e5+5,inf=1ll<<60;
int n,m,rt,rtl,rtr,tot,val[N],mx[N],son[N][2],siz[N],pri[N],tg[N],add[N];
inline int create(){ return ++tot,siz[tot]=1,pri[tot]=rand(),mx[tot]=-inf,tot; }
int push_up(int x){ siz[x]=siz[lc(x)]+siz[rc(x)]+1,mx[x]=val[x]; if(lc(x)) mx[x]=max(mx[x],mx[lc(x)]); if(rc(x)) mx[x]=max(mx[x],mx[rc(x)]); return x; }
void push_down(int x){ if(tg[x]){ swap(lc(x),rc(x));if(lc(x))tg[lc(x)]^=1;if(rc(x))tg[rc(x)]^=1;tg[x]=0; } if(add[x]){ int &p=add[x]; val[x]+=p,mx[x]+=p;if(lc(x))add[lc(x)]+=p;if(rc(x))add[rc(x)]+=p;p=0; } }
void split(int x,int &l,int &r,int k){
if(!x) return l=r=0,void(); push_down(x);
if(rnk(x)<=k) l=x,split(rc(x),rc(x),r,k-rnk(x));
else r=x,split(lc(x),l,lc(x),k); push_up(x);
}
int merge(int l,int r){ if(!l||!r) return l|r;
push_down(l),push_down(r); if(pri[l]<pri[r])
return rc(l)=merge(rc(l),r),push_up(l);
return lc(r)=merge(l,lc(r)),push_up(r);
}
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)
rt=merge(rt,create());
for(int i=1;i<=m;i++){
int op,l,r,v,p; scanf("%lld%lld%lld",&op,&l,&r),
split(rt,rtl,rtr,r),split(rtl,rtl,p,l-1);
if(op==1) scanf("%lld",&v),add[p]+=v; else if(op==2) tg[p]^=1;
else printf("%lld\n",mx[p]); rt=merge(merge(rtl,p),rtr);
} return 0;
}