using namespace std;
#include<iostream>
#include<fstream>
int N;
int P;
int H[100005],st[100005],dr[100005];
#define common int L=2*n,R=L+1,m=(l+r)>>1
ofstream fout("hotel.out");
void update1(int n,int l,int r,int ql,int qr)
{
if(ql<=l&&qr>=r)
{ H[n]=0;
st[n]=0;
dr[n]=0;
return ;
}
common;
if(H[n]==r-l+1)
{H[L]=st[L]=dr[L]=m-l+1;
H[R]=st[R]=dr[R]=r-(m+1)+1;
H[n]=st[n]=dr[n]=0;
}
if(ql<=m) update1(L,l,m,ql,qr);
if(qr>m) update1(R,m+1,r,ql,qr);
st[n]=st[L];
if(st[L]==m-l+1) st[n]+=st[R];
dr[n]=dr[R];
if(dr[R]==r-(m+1)+1) dr[n]+=dr[L];
H[n]=max(H[L],H[R]);
H[n]=max(st[R]+dr[L],H[n]);
H[n]=max(H[n],max(st[n],dr[n]));
}
void update2(int n,int l,int r,int ql,int qr)
{
if(ql<=l&&qr>=r)
{
H[n]=st[n]=dr[n]=r-l+1;
return;
}
common;
if(H[n]==0)
{st[L]=dr[L]=st[R]=dr[R]=H[L]=H[R]=0;
}
if(ql<=m) update2(L,l,m,ql,qr);
if(qr>m) update2(R,m+1,r,ql,qr);
st[n]=st[L];
if(st[L]==m-l+1) st[n]+=st[R];
dr[n]=dr[R];
if(dr[R]==r-(m+1)+1) dr[n]+=dr[L];
H[n]=max(H[L],H[R]);
H[n]=max(st[R]+dr[L],H[n]);
H[n]=max(H[n],max(st[n],dr[n]));
}
void cit()
{int i,x,y,z;
ifstream fin("hotel.in");
fin>>N>>P;
update2(1,1,N,1,N);
for(i=1;i<=P;i++)
{fin>>x;
if(x!=3)
{if(x==1)
{fin>>y>>z;
update1(1,1,N,y,y+z-1);
}
else
{fin>>y>>z;
update2(1,1,N,y,z+y-1);
}
}
else
fout<<H[1]<<"\n";
}
}
int main()
{ cit();
fout.close();
return 0;
}