#include<bits/stdc++.h>
#define ll long long
#define rll register ll
#define F(i,a,b) for(rll i=a;i<=b;i++)
#define Fdn(i,a,b) for(rll i=a;i>=b;i--)
#define int ll
using namespace std;
const int inf = 0x3f3f3f3f,mod = 1e9 + 7;
const int maxn = 1e5 + 7;
namespace FHQTreapPlus{
int root, tot, ls[maxn], rs[maxn], val[maxn], rnd[maxn], siz[maxn], tag[maxn], add[maxn], mx[maxn];
inline void PushUp(int p){
siz[p] = siz[ls[p]] + 1 + siz[rs[p]],
mx[p] = max(mx[ls[p]], max(mx[rs[p]], val[p]));
}
inline int New(int v){
int x = ++tot;
siz[x] = 1, val[x] = v, rnd[x] = rand();
return x;
}
inline void PushDown(int p){
if(tag[p]){
tag[ls[p]] ^= 1, tag[rs[p]] ^= 1,
tag[p] = 0;
swap(ls[p], rs[p]);
}
if(add[p]){
add[ls[p]] += add[p], add[rs[p]] += add[p],
mx[ls[p]] += add[p], mx[rs[p]] += add[p],
val[ls[p]] += add[p], val[rs[p]] += add[p],
add[p] = 0;
}
}
inline void Split(int p, int v, int &x, int &y){
if(!p){
x = y = 0;
return;
}
PushDown(p);
if(siz[ls[p]] >= v) y = p, Split(ls[p], v, x, ls[y]);
else x = p, Split(rs[p], v - siz[ls[p]] - 1, rs[x], y);
PushUp(p);
}
inline int Merge(int x, int y){
if(!x || !y) return x | y;
PushDown(x), PushDown(y);
if(rnd[x] > rnd[y]) {
rs[x] = Merge(rs[x], y);
PushUp(x);
return x;
}
else {
ls[y] = Merge(x, ls[y]);
PushUp(y);
return y;
}
}
}
using namespace FHQTreapPlus;
int n, m;
signed main(){
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
srand(time(0));
cin >> n >> m;
mx[0] = LLONG_MIN;
F(i, 1, n) root = Merge(root, New(0));
F(i, 1, m){
int op, l, r, v;
cin >> op >> l >> r;
if(op == 1) {
cin >> v;
int x, y, z;
Split(root, r, x, z), Split(x, l - 1, x, y);
add[y] += v, val[y] += v, mx[y] += v;
root = Merge(Merge(x, y), z);
} else if(op == 2) {
int x, y, z;
Split(root, r, x, z), Split(x, l - 1, x, y);
tag[y] ^= 1;
root = Merge(Merge(x, y), z);
} else if(op == 3) {
int x, y, z;
Split(root, r, x, z), Split(x, l - 1, x, y);
cout << mx[y] << '\n';
root = Merge(Merge(x, y), z);
}
}
return 0;
}```