#include <bits/stdc++.h>
#define FastIo() ios_base::sync_with_stdio(false), fin.tie(nullptr),fout.tie(nullptr);
#define ll int64_t
#define pii pair<int,int>
#define pipii pair<int,pair<int,int>>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
//#define fin cin
//#define fout cout
int n, m, x, y,op;
const int NMAX = 100001;
ll v[NMAX];
struct tree_node {
ll max, l, r, lazy;
};
vector<tree_node> tree(4 * NMAX);
void update_node(int node, int l, int r){
int m = (l + r)/2;
int l_node = 2 * node;
int r_node = 2 * node + 1;
if(tree[l_node].l == m-l+1) tree[node].l = (m-l+1)+tree[r_node].l;
else tree[node].l = tree[l_node].l;
if(tree[r_node].r == r-m) tree[node].r = r-m + tree[l_node].r;
else tree[node].r = tree[r_node].r;
tree[node].max = max(tree[l_node].r + tree[r_node].l,max(tree[l_node].max,tree[r_node].max));
}
void update_lazy(int node, int l, int r){
if(tree[node].lazy == 1){
tree[node]={0,0,0,0};
if(l!=r)
tree[2*node].lazy = tree[2*node+1].lazy = 1;
}else if(tree[node].lazy==2){
tree[node] = {r-l+1,r-l+1,r-l+1,0};
if(l!=r)
tree[2*node].lazy = tree[2*node+1].lazy = 2;
}
}
void update(int node, int l, int r,int update_l, int update_r, int value){
if(update_l<=l && r<=update_r){
tree[node].lazy = value;
}else{
int m = (l + r)/2;
update_lazy(node, l,r);
if(update_l<=m)
update(2*node, l,m,update_l,update_r,value);
if(m < update_r)
update(2*node+1,m+1,r,update_l,update_r,value);
update_lazy(2*node, l,m);
update_lazy(2*node+1,m+1,r);
update_node(node, l,r);
}
}
int main() {
fin >> n >> m;
tree[1].lazy = 2;
update_lazy(1,1,n);
for(int i=1;i<=m;i++){
fin>>op;
if(op==1){
fin>>x>>y;
update(1,1,n,x,x+y-1,1);
}else if(op==2){
fin>>x>>y;
update(1,1,n,x,x+y-1,2);
}else{
fout<<tree[1].max<<'\n';
}
}
return 0;
}