
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 2e5 + 5;
#define ls (id << 1)
#define rs (id << 1 | 1)
#define mid ((l + r) >> 1)
int n, m;
struct node {
int iss, le, ri, hh, len, tag;
} t[maxn<<2];
node comb(node a, node b) {
node res;
res.iss = a.iss + b.iss;
res.le = !a.iss ? a.len + b.le : a.le;
res.ri = !b.iss ? b.len + a.ri : b.ri;
res.hh = max(a.hh, b.hh);
res.hh = max(res.hh, a.ri + b.le);
res.len = a.len + b.len;
return res;
}
void pushdown(int id) {
//tag1 represents all issues
//tag2 represents all holes
if(t[id].tag == 1) {
t[ls].iss = t[ls].len, t[rs].iss = t[rs].len;
t[ls].le = t[ls].ri = t[ls].hh = 0;
t[rs].le = t[rs].ri = t[rs].hh = 0;
t[ls].tag = t[rs].tag = 1;
t[id].tag = 0;
}
else if(t[id].tag == 2) {
t[ls].iss = t[rs].iss = 0;
t[ls].le = t[ls].ri = t[ls].hh = t[ls].len;
t[rs].le = t[rs].ri = t[rs].hh = t[rs].len;
t[ls].tag = t[rs].tag = 2;
t[id].tag = 0;
}
}
void build(int l, int r, int id) {
if(l == r) t[id].iss = t[id].len = 1;
else {
build(l, mid, ls), build(mid+1, r, rs);
t[id].iss = t[id].len = r-l+1;
}
}
void dig(int ql, int qr, int l, int r, int id) {
if(ql <= l && r <= qr) {
t[id].iss = 0;
t[id].le = t[id].ri = t[id].hh = t[id].len;
t[id].tag = 2;
return;
}
if(t[id].tag) pushdown(id);
if(ql <= mid) dig(ql, qr, l, mid, ls);
if(mid < qr) dig(ql, qr, mid+1, r, rs);
t[id] = comb(t[ls], t[rs]);
}
void heal(int ql, int qr, int l, int r, int id, int& k) {
if(k <= 0) return;
if(t[id].tag) pushdown(id);
if(ql <= l && r <= qr) {
if(t[id].iss == t[id].len) return;
if(k >= t[id].len - t[id].iss) {
k -= t[id].len - t[id].iss;
t[id].iss = t[id].len;
t[id].le = t[id].ri = t[id].hh = 0;
t[id].tag = 1;
return;
}
heal(ql, qr, l, mid, ls, k);
t[id] = comb(t[ls], t[rs]);
if(k <= 0) return;
heal(ql, qr, mid+1, r, rs, k);
t[id] = comb(t[ls], t[rs]);
return;
}
if(ql <= mid) heal(ql, qr, l, mid, ls, k);
t[id] = comb(t[ls], t[rs]);
if(k <= 0) return;
if(mid < qr) heal(ql, qr, mid+1, r, rs, k);
t[id] = comb(t[ls], t[rs]);
}
int cnt(int ql, int qr, int l, int r, int id) {
if(ql <= l && r <= qr) return t[id].iss;
if(t[id].tag) pushdown(id);
int res = 0;
if(ql <= mid) res += cnt(ql, qr, l, mid, ls);
if(mid < qr) res += cnt(ql, qr, mid+1, r, rs);
return res;
}
node query(int ql, int qr, int l, int r, int id) {
if(ql <= l && r <= qr) return t[id];
if(t[id].tag) pushdown(id);
if(qr <= mid) return query(ql, qr, l, mid, ls);
if(mid < ql) return query(ql, qr, mid+1, r, rs);
return comb(query(ql, qr, l, mid, ls), query(ql, qr, mid+1, r, rs));
}
int main() {
// freopen("test.in", "r", stdin);
// freopen("test.out", "w", stdout);
scanf("%d %d", &n, &m);
build(1, n, 1);
for(int i = 1; i <= m; i++) {
int op, l, r;
scanf("%d %d %d", &op, &l, &r);
if(op == 0) dig(l, r, 1, n, 1);
else if(op == 2) printf("%d\n", query(l, r, 1, n, 1).hh);
else {
int hole = cnt(l, r, 1, n, 1);
dig(l, r, 1, n, 1);
scanf("%d %d", &l, &r);
heal(l, r, 1, n, 1, hole);
}
}
return 0;
}