#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
const int N = 100005;
int n,q,e,x,y;
struct Info
{
int left,right,best;
};
Info Tree[N*4+5];
void UpdateNode(int nod, int st, int dr)
{
int mij=((st+dr)>>1)+1;
Tree[nod].right = Tree[nod<<1|1].right;
if(Tree[nod<<1|1].right==(dr-mij+1))
Tree[nod].right += Tree[nod<<1].right;
Tree[nod].left = Tree[nod<<1].left;
if(Tree[nod<<1].left==((st+dr)>>1)-st+1)
Tree[nod].left += Tree[nod<<1|1].left;
Tree[nod].best=max(Tree[nod<<1].best,Tree[nod<<1|1].best);
Tree[nod].best=max(Tree[nod].best,max(Tree[nod].left,Tree[nod].right));
Tree[nod].best=max(Tree[nod].best,Tree[nod<<1].right+Tree[nod<<1|1].left);
}
void BuildTree(int nod, int st, int dr)
{
if(st==dr)
{
Tree[nod].left=Tree[nod].right=Tree[nod].best=1;
return;
}
int mij=(st+dr)>>1;
BuildTree(nod<<1,st,mij);
BuildTree(nod<<1|1,mij+1,dr);
UpdateNode(nod,st,dr);
}
void UpdateTree(int nod, int st, int dr, int pos, int val)
{
if(st==dr)
{
Tree[nod].left=Tree[nod].right=Tree[nod].best=val;
return;
}
int mij=(st+dr)>>1;
if(pos<=mij)
UpdateTree(nod<<1,st,mij,pos,val);
else
UpdateTree(nod<<1|1,mij+1,dr,pos,val);
UpdateNode(nod,st,dr);
}
int main()
{
fin>>n>>q;
BuildTree(1,1,n);
while(q--)
{
fin>>e;
if(e!=3)
{
fin>>x>>y;
for(int i=x; i<=x+y-1; i++)
{
if(e==1)
UpdateTree(1,1,n,i,0);
else
UpdateTree(1,1,n,i,1);
}
}
else
fout<<max(max(Tree[1].left,Tree[1].right),Tree[1].best)<<'\n';
}
}