#include<bits/stdc++.h>
#define int long long
#define DIM 100000
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
int n , m , inainte = 1;
struct Iris{
int sum , sufix , prefix , smax;
}aint[4 * DIM + 5];
int lazy[4 * DIM + 5];
inline Iris combine(Iris st , Iris dr){
Iris rez;
rez.sum = st.sum + dr.sum;
rez.sufix = max(dr.sufix , dr.sum + st.sufix);
rez.prefix = max(st.prefix , st.sum + dr.prefix);
rez.smax = max({st.smax , dr.smax , st.sufix + dr.prefix});
return rez;
}
inline void build(int nod , int st , int dr){
if(st == dr){
aint[nod] = {1 , 1 , 1 , 1};
lazy[nod] = 0;
}
else{
int mid = (st + dr) / 2;
build(2 * nod , st , mid);
build(2 * nod + 1 , mid + 1 , dr);
aint[nod] = combine(aint[2 * nod] , aint[2 * nod + 1]);
lazy[nod] = 0;
}
}
inline void stare(int nod , int st , int dr , int tip){
int lun = dr - st + 1;
if(tip == 1) aint[nod] = {lun , lun , lun , lun};
else if(tip == 2) aint[nod] = {-1000000000 * lun , 0 , 0 , 0};
lazy[nod] = tip;
}
inline void push(int nod , int st , int dr){
if(lazy[nod] != 0 && st != dr){
int mid = (st + dr) / 2;
stare(2 * nod , st , mid , lazy[nod]);
stare(2 * nod + 1 , mid + 1 , dr , lazy[nod]);
lazy[nod] = 0;
}
}
inline void update(int nod , int st , int dr , int a , int b , int tip){
if(a <= st && dr <= b){
stare(nod , st , dr , tip);
}
else if(a > dr && st > b) return ;
else{
push(nod , st , dr);
int mid = (st + dr) / 2;
if(a <= mid) update(2 * nod , st , mid , a , b , tip);
if(b > mid) update(2 * nod + 1 , mid + 1 , dr , a , b , tip);
aint[nod] = combine(aint[2 * nod] , aint[2 * nod + 1]);
}
}
signed main(){
fin >> n >> m;
build(1 , 1 , n);
for(int i = 1; i <= m ; i++){
int tip; fin >> tip;
if(tip == 1){
int x , y; fin >> x >> y;
update(1 , 1 , n , x , x + y - 1 , 2);
}
else if(tip == 2){
int x , y; fin >> x >> y;
update(1 , 1 , n , x , x + y - 1 , 1);
}
else fout << aint[1].smax << '\n';
}
}