#include <bits/stdc++.h>
#ifdef LOCAL
#define in cin
#define out cout
#endif
using namespace std;
#ifndef LOCAL
ifstream in("hotel.in");
ofstream out("hotel.out");
#endif
struct aint
{
int nxtp2(int n)
{
int p=1;
while(p<n)p*=2;
return p;
}
int offset;
int *data,*lazy;
int *pref,*suf,*maxx;
aint(int n)
{
offset=nxtp2(n);
data = new int[offset*2];
lazy = new int[offset*2];
pref = new int[offset*2];
suf = new int[offset*2];
maxx = new int[offset*2];
for(int i=0;i<n;i++)data[i+offset]=1;
for(int i=0;i<offset*2;i++)
{
lazy[i]=pref[i]=suf[i]=maxx[i]=0;
}
init(0,offset-1,1);
//cerr<<"here\n";
}
void debug(int ind)
{
ind++;
cerr<<ind<<".\n";
cerr<<"data\n";
for(int i=0,ind=1;i<1;i++,ind++)cerr<<data[ind]<<' ';
cerr<<'\n';
for(int i=0,ind=2;i<2;i++,ind++)cerr<<data[ind]<<' ';
cerr<<'\n';
for(int i=0,ind=4;i<4;i++,ind++)cerr<<data[ind]<<' ';
cerr<<'\n';
for(int i=0,ind=8;i<8;i++,ind++)cerr<<data[ind]<<' ';
cerr<<'\n';
for(int i=0,ind=16;i<16;i++,ind++)cerr<<data[ind]<<' ';
cerr<<'\n';
cerr<<"pref\n";
for(int i=0,ind=1;i<1;i++,ind++)cerr<<pref[ind]<<' ';
cerr<<'\n';
for(int i=0,ind=2;i<2;i++,ind++)cerr<<pref[ind]<<' ';
cerr<<'\n';
for(int i=0,ind=4;i<4;i++,ind++)cerr<<pref[ind]<<' ';
cerr<<'\n';
for(int i=0,ind=8;i<8;i++,ind++)cerr<<pref[ind]<<' ';
cerr<<'\n';
for(int i=0,ind=16;i<16;i++,ind++)cerr<<pref[ind]<<' ';
cerr<<'\n';
cerr<<"suf\n";
for(int i=0,ind=1;i<1;i++,ind++)cerr<<suf[ind]<<' ';
cerr<<'\n';
for(int i=0,ind=2;i<2;i++,ind++)cerr<<suf[ind]<<' ';
cerr<<'\n';
for(int i=0,ind=4;i<4;i++,ind++)cerr<<suf[ind]<<' ';
cerr<<'\n';
for(int i=0,ind=8;i<8;i++,ind++)cerr<<suf[ind]<<' ';
cerr<<'\n';
for(int i=0,ind=16;i<16;i++,ind++)cerr<<suf[ind]<<' ';
cerr<<'\n';
cerr<<"maxx\n";
for(int i=0,ind=1;i<1;i++,ind++)cerr<<maxx[ind]<<' ';
cerr<<'\n';
for(int i=0,ind=2;i<2;i++,ind++)cerr<<maxx[ind]<<' ';
cerr<<'\n';
for(int i=0,ind=4;i<4;i++,ind++)cerr<<maxx[ind]<<' ';
cerr<<'\n';
for(int i=0,ind=8;i<8;i++,ind++)cerr<<maxx[ind]<<' ';
cerr<<'\n';
for(int i=0,ind=16;i<16;i++,ind++)cerr<<maxx[ind]<<' ';
cerr<<"\n\n";
}
void init(int st,int dr,int node)
{
if(st==dr)
{
suf[node]=pref[node]=maxx[node]=data[node];
}
else
{
int mid=(st+dr)/2;
int s=dr-st+1;
init(st,mid,node*2);
init(mid+1,dr,node*2+1);
data[node]=data[node*2]+data[node*2+1];
maxx[node]=max(maxx[node*2],maxx[node*2+1]);
maxx[node]=max(maxx[node],pref[node*2]);
maxx[node]=max(maxx[node],suf[node*2]+pref[node*2+1]);
maxx[node]=max(maxx[node],suf[node*2+1]);
if(data[node*2]==s/2)pref[node]=s/2+pref[node*2+1];
else pref[node]=pref[node*2];
if(data[node*2+1]==s/2)suf[node]=s/2+suf[node*2];
else suf[node]=suf[node*2+1];
}
}
void pushLazy(int st,int dr,int node)
{
if(st!=dr)
{
lazy[node*2]+=lazy[node];
lazy[node*2+1]+=lazy[node];
}
int s=dr-st+1;
data[node]+=s*lazy[node];
if(lazy[node]!=0)suf[node]=pref[node]=maxx[node]=data[node];
lazy[node]=0;
}
void _update(int l,int r,int val,int st,int dr,int node)
{
pushLazy(st,dr,node);
if(l>r)return;
if(l==st&&r==dr)
{
lazy[node]+=val;
pushLazy(st,dr,node);
}
else
{
pushLazy(st,dr,node);
int mid=(st+dr)/2;
int s=dr-st+1;
_update(l,min(r,mid),val,st,mid,node*2);
_update(max(mid+1,l),r,val,mid+1,dr,node*2+1);
data[node]=data[node*2]+data[node*2+1];
maxx[node]=max(maxx[node*2],maxx[node*2+1]);
maxx[node]=max(maxx[node],pref[node*2]);
maxx[node]=max(maxx[node],suf[node*2]+pref[node*2+1]);
maxx[node]=max(maxx[node],suf[node*2+1]);
if(data[node*2]==s/2)pref[node]=s/2+pref[node*2+1];
else pref[node]=pref[node*2];
if(data[node*2+1]==s/2)suf[node]=s/2+suf[node*2];
else suf[node]=suf[node*2+1];
}
}
void update(int l,int r,int val)
{
_update(l,r,val,0,offset-1,1);
}
};
int main()
{
int n,p;in>>n>>p;
aint root = aint(n);
for(int i=0;i<p;i++)
{
//root.debug(i);
int c;in>>c;
if(c==1)
{
int a,b;in>>a>>b;
a--;
b=a+b-1;
root.update(a,b,-1);
}
else if(c==2)
{
int a,b;in>>a>>b;
a--;
b=a+b-1;
root.update(a,b,1);
}
else
{
out<<root.maxx[1]<<'\n';
}
}
}