#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 50005,maxm = 100005,INF = 2147483247;
struct node{
int fa,lc,rc,p,v,z,size,max;
node(int f=0):fa(f),v(0),lc(0),rc(0),p(0),z(0),size(0){}
}T[maxn];
int n,m,root;
void Merge(int x){
int l = T[x].lc, r = T[x].rc;
T[x].size = T[l].size+1+T[r].size;
T[x].max = max(max(T[l].max,T[r].max),T[x].v);
}
int find(int x){
int tmp = root;
while(1){
if(T[T[tmp].lc].size+1 == x)return tmp;
if(T[T[tmp].lc].size>=x)tmp = T[tmp].lc;
else x-=T[T[tmp].lc].size+1,tmp = T[tmp].rc;
}
}
int build(int fa,int l,int r){
int mid = l+r>>1;
T[mid] = node(fa);
if(l<mid)T[mid].lc = build(mid,l,mid-1);
if(mid<r)T[mid].rc = build(mid,mid+1,r);
Merge(mid);
return mid;
}
void pushdown(int x){
if(!T[x].z && !T[x].p)return;
if(T[x].z)swap(T[x].lc,T[x].rc),T[T[x].lc].z^=1,T[T[x].rc].z^=1;
if(T[x].p)T[x].v+=T[x].p, T[T[x].lc].p+=T[x].p, T[T[x].rc].p+=T[x].p, T[x].p=0;
}
void rotate(int x){
int f = T[x].fa;pushdown(f);pushdown(x);
T[x].fa = T[f].fa; T[f].fa = x;
if(T[T[x].fa].lc == f)T[T[x].fa].lc = x;else T[T[x].fa].rc = x;
if(T[f].lc == x)T[f].lc = T[x].rc, T[T[x].rc].fa = f, T[x].rc = f;
else T[f].rc = T[x].lc, T[T[x].lc].fa = f, T[x].lc = f;
Merge(f);
}
void splay(int x,int k){
pushdown(x);
for(int f=T[x].fa;(f=T[x].fa)!=k;rotate(x))
if(T[f].fa!=k)rotate((T[f].lc == x)^(T[T[f].fa].lc == f)?x:f);
Merge(x);
if(k==0)root = x;
}
void solve1(int l,int r,int v){
splay(find(l-1),0);splay(find(r+1),root);
T[root].p+=v;
pushdown(root);
}
void solve2(int l,int r){
splay(find(l-1),0);splay(find(r+1),root);
T[root].z ^=1;
pushdown(root);
}
int solve3(int l,int r){
splay(find(l-1),0);splay(find(r+1),root);
return T[root].max;
}
int main(){
freopen("data","r",stdin);
scanf("%d%d",&n,&m);
root = build(0,1,n+2);
int l,r,v,p;
while(m--){
scanf("%d%d%d",&p,&l,&r);
if(p == 1)scanf("%d",&v),
solve1(l,r,v);
if(p == 2)solve2(l,r);
if(p == 3)cout<<solve3(l,r)<<endl;
};
return 0;
}
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 50005,maxm = 100005,INF = 2147483247;
struct node{
int fa,lc,rc,p,v,z,size,max;
node(int f=0):fa(f),v(0),lc(0),rc(0),p(0),z(0),size(0){}
}T[maxn];
int n,m,root;
void Merge(int x){
int l = T[x].lc, r = T[x].rc;
T[x].size = T[l].size+1+T[r].size;
T[x].max = max(max(T[l].max,T[r].max),T[x].v);
}
int find(int x){
int tmp = root;
while(1){
if(T[T[tmp].lc].size+1 == x)return tmp;
if(T[T[tmp].lc].size>=x)tmp = T[tmp].lc;
else x-=T[T[tmp].lc].size+1,tmp = T[tmp].rc;
}
}
int build(int fa,int l,int r){
int mid = l+r>>1;
T[mid] = node(fa);
if(l<mid)T[mid].lc = build(mid,l,mid-1);
if(mid<r)T[mid].rc = build(mid,mid+1,r);
Merge(mid);
return mid;
}
void pushdown(int x){
if(!T[x].z && !T[x].p)return;
if(T[x].z)swap(T[x].lc,T[x].rc),T[T[x].lc].z^=1,T[T[x].rc].z^=1;
if(T[x].p)T[x].v+=T[x].p, T[T[x].lc].p+=T[x].p, T[T[x].rc].p+=T[x].p, T[x].p=0;
}
void rotate(int x){
int f = T[x].fa;pushdown(f);pushdown(x);
T[x].fa = T[f].fa; T[f].fa = x;
if(T[T[x].fa].lc == f)T[T[x].fa].lc = x;else T[T[x].fa].rc = x;
if(T[f].lc == x)T[f].lc = T[x].rc, T[T[x].rc].fa = f, T[x].rc = f;
else T[f].rc = T[x].lc, T[T[x].lc].fa = f, T[x].lc = f;
Merge(f);
}
void splay(int x,int k){
pushdown(x);
for(int f=T[x].fa;(f=T[x].fa)!=k;rotate(x))
if(T[f].fa!=k)rotate((T[f].lc == x)^(T[T[f].fa].lc == f)?x:f);
Merge(x);
if(k==0)root = x;
}
void solve1(int l,int r,int v){
splay(find(l-1),0);splay(find(r+1),root);
T[root].p+=v;
pushdown(root);
}
void solve2(int l,int r){
splay(find(l-1),0);splay(find(r+1),root);
T[root].z ^=1;
pushdown(root);
}
int solve3(int l,int r){
splay(find(l-1),0);splay(find(r+1),root);
return T[root].max;
}
int main(){
freopen("data","r",stdin);
scanf("%d%d",&n,&m);
root = build(0,1,n+2);
int l,r,v,p;
while(m--){
scanf("%d%d%d",&p,&l,&r);
if(p == 1)scanf("%d",&v),
solve1(l,r,v);
if(p == 2)solve2(l,r);
if(p == 3)cout<<solve3(l,r)<<endl;
};
return 0;
}