#include <fstream>
using namespace std;
//////////////////////////////////////
ifstream cin("hotel.in");
ofstream cout("hotel.out");
const int MAX = 1e5 + 1;
struct a{
int sf , pf , maxz , lazy;
}aint[4*MAX];
int n , q , a , b , op;
/////////////////////////////////////////////
void update_node( int nod , int st , int dr){
if( st < dr ){
int m = (st+dr)/2;
aint[nod].maxz = max(aint[nod*2].sf + aint[nod*2+1].pf ,max(aint[nod*2].maxz,aint[nod*2+1].maxz));
if(aint[nod*2+1].maxz == (dr-m)) aint[nod].sf = aint[nod*2].sf + (dr-m);
else aint[nod].sf = aint[nod*2+1].sf;
if(aint[nod*2].maxz == (m-st+1)) aint[nod].pf = aint[nod*2+1].pf + (m-st+1);
else aint[nod].pf = aint[nod*2].pf;
}
}
void init( int nod , int st , int dr){
if(st==dr){
aint[nod].sf = 1;
aint[nod].pf = 1;
aint[nod].maxz = 1;
aint[nod].lazy = 0;
}else{
int mij = (st+dr)/2;
init(nod*2,st,mij);
init(nod*2+1,mij+1,dr);
aint[nod].maxz = aint[nod*2].maxz + aint[nod*2+1].maxz;
aint[nod].sf = aint[nod*2].sf + aint[nod*2+1].sf;
aint[nod].pf = aint[nod*2].sf + aint[nod*2+1].sf;
aint[nod].lazy = 0;
}
}
void updatelazy( int nod , int st , int dr ){
if(!aint[nod].lazy){
}else if(aint[nod].lazy == 1){
aint[nod].lazy = 0;
aint[nod].maxz = 0;
aint[nod].sf = 0;
aint[nod].pf = 0;
if(st!=dr){
aint[nod*2].lazy = aint[nod*2+1].lazy = 1;
}
}else if(aint[nod].lazy == 2){
aint[nod].lazy = 0;
aint[nod].maxz = (dr-st+1);
aint[nod].sf = (dr-st+1);
aint[nod].pf = (dr-st+1);
if(st!=dr){
aint[nod*2].lazy = aint[nod*2+1].lazy = 2;
}
}
}
void update1( int nod , int st , int dr , int lst , int ldr){
updatelazy(nod,st,dr);
if( lst <= st && dr <= ldr ){
aint[nod].lazy = 1;
updatelazy(nod,st,dr);
}else{
int m = (st+dr)/2;
if(lst <= m){
update1(nod*2,st,m,lst,ldr);
}
if(ldr > m){
update1(nod*2+1,m+1,dr,lst,ldr);
}
updatelazy(nod*2,st,m);
updatelazy(nod*2+1,m+1,dr);
update_node(nod,st,dr);
}
}
void update2( int nod , int st , int dr , int lst , int ldr){
updatelazy(nod,st,dr);
if( lst <= st && dr <= ldr ){
aint[nod].lazy = 2;
updatelazy(nod,st,dr);
}else{
int m = (st+dr)/2;
if(lst <= m){
update2(nod*2,st,m,lst,ldr);
}
if(ldr > m){
update2(nod*2+1,m+1,dr,lst,ldr);
}
updatelazy(nod*2,st,m);
updatelazy(nod*2+1,m+1,dr);
update_node(nod,st,dr);
}
}
int main()
{
cin >> n >> q;
init(1,1,n);
while(q--){
cin >> op;
if(op==3){
cout <<aint[1].maxz << '\n';
}
if(op==1){
cin >> a >> b;
b+=a;
b--;
update1(1,1,n,a,b);
}
if(op==2){
cin >> a >> b;
b+=a;
b--;
update2(1,1,n,a,b);
}
}
return 0;
}