#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<queue>
#include<cmath>
#include<algorithm>
using namespace std;
int l,n,a,b,i=0,hei=0;
struct node{
int ll,rr;
int sum;
int sm;
int lan;
}tree[1000000];
void build(long long l,long long r,long long n){
tree[n].ll=l;
tree[n].rr=r;
if(l==r){
return;
}
build(l,(l+r)/2,n*2);
build((l+r)/2+1,r,n*2+1);
}
void down(int num){
tree[num*2].lan=1;
tree[num*2+1].lan=1;
tree[num].lan=0;
tree[num*2].sm=0;
tree[num*2+1].sm=0;
tree[num*2].sum=tree[num*2].rr-tree[num*2].ll+1;
tree[num*2+1].sum=tree[num*2+1].rr-tree[num*2+1].ll+1;
return;
}
void cut(int l,int r,int num){
if(a<=l&&r<=b){
tree[num].sum=r-l+1;
hei+=tree[num].sm;
tree[num].sm=0;
tree[num].lan=1;
return;
}
if(tree[num].lan){
down(num);
}
if(a<=(l+r)/2)cut(l,(l+r)/2,num*2);
if(b>(l+r)/2)cut((l+r)/2+1,r,num*2+1);
tree[num].sum=tree[num*2].sum+tree[num*2+1].sum;
tree[num].sm=tree[num*2].sm+tree[num*2+1].sm;
}
void plant(int l,int r,int num){
if(a<=l&&r<=b){
tree[num].sm=tree[num].sum;
tree[num].sum=0;
return;
}
if(tree[num].lan){
down(num);
}
if(a<=(l+r)/2)plant(l,(l+r)/2,num*2);
if(b>(l+r)/2)plant((l+r)/2+1,r,num*2+1);
tree[num].sum=tree[num*2].sum+tree[num*2+1].sum;
tree[num].sm=tree[num*2].sm+tree[num*2+1].sm;
}
int main(){
cin >>l>>n;
build(1,1+l,1);
for(i=0;i<n;i++){
int t;
cin >>t>>a>>b;
a++;
b++;
if(t==0){
cut(1,l+1,1);
long long t=1,t1=1;
for(long long j=1;j<=12;j++){
cout <<j<<" ("<<tree[j].sm<<","<<tree[j].sum<<") ";
if(t==j){
cout <<endl;
t+=2*t1;
t1++;
}
}
cout <<endl;
}
if(t==1){
plant(1,l+1,1);
long long t=1,t1=1;
for(long long j=1;j<=12;j++){
cout <<j<<" ("<<tree[j].sm<<","<<tree[j].sum<<") ";
if(t==j){
cout <<endl;
t+=2*t1;
t1++;
}
}
cout <<endl;
}
}
cout <<tree[1].sm<<endl<<hei;
return 0;
}