#include <cstdio>
#include <algorithm>
using namespace std;
struct punct
{
int x, y;
}a[400004];
int n, m, j, tip, ind, nr, Arb[400004], k, Max;
void update1(int nod, int st, int dr)
{
if (st==dr){
Arb[nod]=1;
return;
}
int mij=(st+dr)/2;
if (j<=mij) update1(2*nod, st, mij);
else update1(2*nod+1, mij+1, dr);
Arb[nod]=Arb[2*nod]+Arb[2*nod+1];
}
void update2(int nod, int st, int dr)
{
if (st==dr){
Arb[nod]=0;
return;
}
int mij=(st+dr)/2;
if (j<=mij) update2(2*nod, st, mij);
else update2(2*nod+1, mij+1, dr);
Arb[nod]=Arb[2*nod]+Arb[2*nod+1];
}
void cauta(int st, int dr)
{
int p=k;
for (int i=1; i<=k; i++)
if (a[i].y==st) p=i;
if (p==k && a[k].y!=st){
k++;
a[k].x=st; a[k].y=dr;
}
else a[p].y=dr;
}
void query(int nod, int st, int dr)
{
if (st>dr) return;
if (Arb[nod]==0){
cauta(st, dr);
return;
}
int mij=(st+dr)/2;
query(2*nod, st, mij);
query(2*nod+1, mij+1, dr);
}
int main ()
{
freopen("meh.in", "r", stdin);
freopen("meh.out", "w", stdout);
scanf("%d%d", &n, &m);
for (int l=1; l<=m; l++){
scanf("%d", &tip);
if (tip==1){
scanf("%d%d", &ind, &nr);
for(j=ind; j<ind+nr; j++)
update1(1, 1, n);
}
else if (tip==2){
scanf("%d%d", &ind, &nr);
for(j=ind; j<ind+nr; j++)
update2(1, 1, n);
for (int i=1; i<=k; i++){
if (a[i].y-a[i].x+1>Max) Max=a[i].y-a[i].x+1;
printf("%d %d ", a[i].x, a[i].y);
}printf("\n");
}
else{
k=0;
query(1, 1, n);
Max=0;
for (int i=1; i<=k; i++){
if (a[i].y-a[i].x+1>Max) Max=a[i].y-a[i].x+1;
printf("%d %d ", a[i].x, a[i].y);
}
printf("\n");
printf("%d\n", Max);
}
}
}