#include <cstdio>
#include <algorithm>
#define left (2*node)
#define right (2*node+1)
#define gol first
#define l second.first
#define r second.second
#define Nmax 100010
using namespace std;
pair < int , pair < int , int > > hotel[3*Nmax];
int N , Q , i , tip , st , dr;
void update(int node , int begin , int end , int st , int dr , int mod)
{
if (st <= begin && end <= dr)
{
if (mod == 1) hotel[node].l = hotel[node].r = hotel[node].gol = 0;
else hotel[node].l = hotel[node].r = hotel[node].gol = end - begin + 1;
}
if (begin == end) return;
int mid = (begin + end) >> 1;
if (st <= mid) update(left , begin , mid , st , dr , mod);
if (mid < dr) update(right , mid + 1 , end , st , dr , mod);
if (hotel[left].l == mid - begin + 1) hotel[node].l = hotel[left].l + hotel[right].l;
else hotel[node].l = hotel[left].l;
if (hotel[right].r == end - mid) hotel[node].r = hotel[right].r + hotel[left].r;
else hotel[node].r = hotel[right].r;
hotel[node].gol = max(max(hotel[left].gol , hotel[right].gol) , hotel[left].r + hotel[right].l);
}
int main()
{
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
scanf("%d %d", &N, &Q);
update(1 , 1 , N , 1 , N , 0);
for (i = 1; i <= Q; ++i)
{
scanf("%d", &tip);
if (tip == 1)
{
scanf("%d %d", &st, &dr); dr = st + dr - 1;
update(1 , 1 , N , st , dr , 1);
}
else if (tip == 2)
{
scanf("%d %d", &st, &dr); dr = st + dr - 1;
update(1 , 1 , N , st , dr , 0);
}
else printf("%d\n", hotel[1].gol);
}
return 0;
}