1 #include<cstdio>
2 #include<iostream>
3 #include<cmath>
4 #include<cstring>
5 #include<algorithm>
6 #define maxn 50005
7 using namespace std;
8 typedef pair<int,int> pii;
9 char ch;
10 int n,m,root,op,l,r,x;
11 bool ok;
12 void read(int &x){
13 for (ok=0,ch=getchar();!isdigit(ch);ch=getchar()) if (ch==‘-‘) ok=1;
14 for (x=0;isdigit(ch);x=x*10+ch-‘0‘,ch=getchar());
15 if (ok) x=-x;
16 }
17 int random(int mod){return rand()*rand()%mod+1;}
18 struct fhq_treap{
19 int son[maxn][2],add[maxn],rev[maxn],max_val[maxn],val[maxn],siz[maxn];
20 void init(){for (int i=1;i<=n;i++) siz[i]=1;}
21 void Rev(int a){rev[a]^=1;}
22 void inc(int a,int v){add[a]+=v,max_val[a]+=v,val[a]+=v;}
23 void pushdown(int a){
24 if (rev[a]) Rev(son[a][0]),Rev(son[a][1]),rev[a]=0,swap(son[a][0],son[a][1]);
25 if (add[a]) inc(son[a][0],add[a]),inc(son[a][1],add[a]),add[a]=0;
26 }
27 void update(int a){
28 siz[a]=1,max_val[a]=val[a];
29 if (son[a][0]) siz[a]+=siz[son[a][0]],max_val[a]=max(max_val[a],max_val[son[a][0]]);
30 if (son[a][1]) siz[a]+=siz[son[a][1]],max_val[a]=max(max_val[a],max_val[son[a][1]]);
31 }
32 int merge(int a,int b){
33 if (!a||!b) return a+b;
34 if (random(siz[a]+siz[b])<=siz[a]){
35 pushdown(a),son[a][1]=merge(son[a][1],b),update(a);
36 return a;
37 }
38 else{
39 pushdown(b),son[b][0]=merge(a,son[b][0]),update(b);
40 return b;
41 }
42 }
43 pii split(int a,int k){
44 if (!k) return make_pair(0,a);
45 if (siz[a]==k) return make_pair(a,0);
46 pushdown(a);
47 if (siz[son[a][0]]>=k){
48 pii tmp=split(son[a][0],k);
49 son[a][0]=tmp.second,update(a);
50 return make_pair(tmp.first,a);
51 }
52 else{
53 pii tmp=split(son[a][1],k-siz[son[a][0]]-1);
54 son[a][1]=tmp.first,update(a);
55 return make_pair(a,tmp.second);
56 }
57 }
58 }T;
59 void add(int l,int r,int x){
60 pii t;
61 int a,b,c;
62 t=T.split(root,r);
63 c=t.second;
64 t=T.split(t.first,l-1);
65 a=t.first,b=t.second;
66 T.inc(b,x);
67 root=T.merge(a,b),root=T.merge(root,c);
68 }
69 void rev(int l,int r){
70 pii t;
71 int a,b,c;
72 t=T.split(root,r);
73 c=t.second;
74 t=T.split(t.first,l-1);
75 a=t.first,b=t.second;
76 T.Rev(b);
77 root=T.merge(a,b),root=T.merge(root,c);
78 }
79 void query(int l,int r){
80 pii t;
81 int a,b,c;
82 t=T.split(root,r);
83 c=t.second;
84 t=T.split(t.first,l-1);
85 a=t.first,b=t.second;
86 printf("%d\n",T.max_val[b]);
87 root=T.merge(a,b),root=T.merge(root,c);
88 }
89 int main(){
90 srand(‘f‘+‘u‘+‘c‘+‘k‘+‘w‘+‘m‘+‘j‘);
91 read(n),read(m),T.init(),root=1;
92 for (int i=2;i<=n;i++) root=T.merge(root,i);
93 while (m--){
94 read(op),read(l),read(r);
95 if (op==1) read(x),add(l,r,x);
96 else if (op==2) rev(l,r);
97 else query(l,r);
98 }
99 return 0;
100 }