#include <cstdio>
#include <algorithm>
using namespace std;
#define MAXN 100010
typedef struct leaf {
int l, r, c;
} leaf;
leaf T[4*MAXN+10];
void Update(int node, int l, int r, int a, int b, int v){
if(a<=l && r<=b){
if(!v)
T[node].c=T[node].l=T[node].r=r-l+1;
else
T[node].c=T[node].l=T[node].r=0;
}
else {
int mid=((r-l)>>1)+l, N1=node<<1, N2=(node<<1)+1;
if(!T[node].c){
T[N1].c=T[N1].l=T[N1].r=0;
T[N2].c=T[N2].l=T[N2].r=0;
}
if(T[node].c == r-l+1){
T[N1].c=T[N1].l=T[N1].r=mid-l+1;
T[N2].c=T[N2].l=T[N2].r=r-mid;
}
if(a<=mid)
Update(N1, l, mid, a, b, v);
if(b>mid)
Update(N2, mid+1, r, a, b, v);
T[node].l=T[N1].l;
if(T[N1].l == mid-l+1)
T[node].l+=T[N2].l;
T[node].r=T[N2].r;
if(T[N2].r == r-mid)
T[node].r+=T[N1].r;
T[node].c=max(max(T[node].l, T[node].r), max(T[N1].c, T[N2].c));
T[node].c=max(T[node].c, T[N1].r+T[N2].l);
}
}
int main(){
freopen("hotel.in", "r", stdin);
freopen("hotel.out", "w", stdout);
int N, P, i, c, a, b;
scanf("%d%d", &N, &P);
for(i=1; i<=N; i++)
Update(1, 1, N, i, i, 0);
for(i=0; i<P; i++){
scanf("%d", &c);
if(c==1){
scanf("%d%d", &a, &b);
Update(1, 1, N, a, a+b-1, 1);
}
else if(c==2){
scanf("%d%d", &a, &b);
Update(1, 1, N, a, a+b-1, 0);
}
else
printf("%d\n", T[1].c);
}
return 0;
}