WA 前 4 点
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=100005;
namespace Splay{
int tot=0,head=0;
int sz[N],val[N],h[N][2],fa[N],lazy[N],maxv[N],cnt[N],lazy0[N],key[N];
bool get(int x){return h[fa[x]][1]==x;}
void maintain(int x){
if(!x)return ;
val[h[x][0]]+=lazy0[x];
maxv[h[x][0]]+=lazy0[x];
lazy0[h[x][0]]+=lazy0[x];
val[h[x][1]]+=lazy0[x];
maxv[h[x][1]]+=lazy0[x];
lazy0[h[x][1]]+=lazy0[x];
sz[x]=sz[h[x][1]]+sz[h[x][0]]+cnt[x];lazy0[0]=val[0]=maxv[0]=0;
maxv[x]=max(max(val[h[x][0]],maxv[h[x][0]]),max(val[h[x][1]],maxv[h[x][1]]));
lazy0[x]=0;
}
void pushdown(int x){
if(lazy[x]){
lazy[h[x][0]]^=1;lazy[h[x][1]]^=1;
swap(h[x][0],h[x][1]);lazy[x]=0;
}
}
void rotate(int x){
int y=fa[x],z=fa[y],d=get(x);
maintain(y);maintain(x);
h[y][d]=h[x][d^1];
if(h[x][d^1])fa[h[x][d^1]]=y;
h[x][d^1]=y;
if(z)h[z][y==h[z][1]]=x;
fa[y]=x;fa[x]=z;fa[0]=0;
maintain(y),maintain(x);
}
void splay(int x){
for(int i=fa[x];i=fa[x],i;rotate(x)){
if(fa[i])rotate(get(x)==get(i)?i:x);
} head=x;
}
void splay0(int x,int goal){
for(int i;(i=fa[x])!=goal;rotate(x)){
if (fa[i]!=goal)rotate((get(x)==get(i))?i:x);
} if(goal==0)head=x;
}
void ins(int k){
if(!head){
head=++tot;key[tot]=k;
cnt[tot]++;maintain(head);
return ;
} int cur=head,f=0;
while(1){
f=cur;cur=h[cur][key[cur]<k];
if(!cur){
key[++tot]=k;cnt[tot]++;
fa[tot]=f;h[f][key[f]<k]=tot;
maintain(tot);maintain(f);
splay(tot);break;
}
}
}
int rank(int k){
int cur=head;
while(1){
pushdown(cur);maintain(cur);
if(h[cur][0]&&k<=sz[h[cur][0]])
cur=h[cur][0];
else {
int tmp=sz[h[cur][0]]+1;
if(k<=tmp)return key[cur];
k-=tmp;cur=h[cur][1];
}
}
}
void reverse(int l,int r){
l=rank(l);r=rank(r+2);
splay0(l,0);splay0(r,l);
lazy[h[h[head][1]][0]]^=1;
}
void merge(int l,int r,int key){
l=rank(l);r=rank(r+2);
splay0(l,0);splay0(r,l);
val[h[h[head][1]][0]]+=key;
lazy0[h[h[head][1]][0]]+=key;
maintain(h[h[head][1]][0]);
}
int forward(int l,int r){
l=rank(l);r=rank(r+2);
splay0(l,0);splay0(r,l);
return max(maxv[h[h[head][1]][0]],val[h[h[head][1]][0]]);
}
}
signed main()
{
int n,t0;cin>>n>>t0;
for(int i=1;i<=n+2;i++)
Splay::ins(i);
while(t0--){
int opt,l,r,w;
cin>>opt>>l>>r;
if(opt==1)cin>>w,
Splay::merge(l,r,w);
if(opt==2)Splay::reverse(l,r);
if(opt==3)cout<<Splay::forward(l,r)<<"\n";
}
return 0;
}