/*
3 6
1 1 1
1 1 4
1 2 2
1 2 4
1 3 3
1 3 4
*/
#include<bits/stdc++.h>
using namespace std;
vector<int>disc;
int getid(int x){
return lower_bound(disc.begin(),disc.end(),x)-disc.begin()+1;
}
//hdu 4578
#define ls (rt<<1)
#define rs (ls|1)
#define ml ((l+r)>>1)
#define mr (ml+1)
const int maxn=55555*6;
int rev[maxn<<2],cov[maxn<<2],sum[maxn<<2],a[maxn];
void push_son(int son,int l,int r,int covrt,int revrt){
if(covrt!=-1){
sum[son]=((disc[r-1+1]-1)-disc[l-1]+1)*covrt;
cov[son]=covrt;
rev[son]=0;
}
if(revrt!=0){
sum[son]=((disc[r-1+1]-1)-disc[l-1]+1)-sum[son];
rev[son]^=1;
}
}
void push_down(int rt,int l,int r){
push_son(ls,l,ml,cov[rt],rev[rt]);
push_son(rs,mr,r,cov[rt],rev[rt]);
cov[rt]=-1; rev[rt]=0;
}
void push_up(int rt,int l,int r){
sum[rt]=sum[ls]+sum[rs];
}
void build(int rt,int l,int r){
cov[rt]=-1;
rev[rt]=0;
if(l==r){
sum[rt]=0;
}
else{
build(ls,l,ml);
build(rs,mr,r);
push_up(rt,l,r);
}
}
void update(int rt,int l,int r,int ql,int qr,int d,int type){
if(l!=r) push_down(rt,l,r);
if(ql<=l&&r<=qr){
if(type==1) push_son(rt,l,r,-1,1);//rev
if(type==2) push_son(rt,l,r, d,0);//cover
}
else{
if(ml>=ql) update(ls,l,ml,ql,qr,d,type);
if(mr<=qr) update(rs,mr,r,ql,qr,d,type);
push_up(rt,l,r);
}
}
int query(int rt,int l,int r,int ql,int qr){
if(l!=r) push_down(rt,l,r);
if(ql<=l&&r<=qr){
return sum[rt];
}
else{
int ret=0;
if(ml>=ql) ret+=query(ls,l,ml,ql,qr);
if(mr<=qr) ret+=query(rs,mr,r,ql,qr);
return ret;
}
}
int read(){
int ret=0,fu=1;
char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-') fu=-1;
ch=getchar();
}
while('0'<=ch&&ch<='9') {
ret=(ret<<1)+(ret<<3)+(ch^48);
ch=getchar();
}
return ret*fu;
}
int L[maxn],R[maxn],OP[maxn];
int main(){
int n=read();
int q=read();
for(int i=0;i<q;i++) {
L[i]=read();
R[i]=read();
OP[i]=read();
disc.push_back(L[i]);
disc.push_back(R[i]);
disc.push_back(L[i]+1);
disc.push_back(R[i]+1);
disc.push_back(L[i]-1);
disc.push_back(R[i]-1);
}
sort(disc.begin(),disc.end());
disc.erase(unique(disc.begin(),disc.end()),disc.end());
build(1,1,disc.size());
for(int i=0;i<q;i++){
int l=getid(L[i]);
int r=getid(R[i]);
int op=OP[i];
if(op==1) update(1,1,disc.size(),l,r,0,2);
if(op==2) update(1,1,disc.size(),l,r,1,2);
if(op==3) update(1,1,disc.size(),l,r,1,1);
if(op==4) printf("%d\n",query(1,1,disc.size(),l,r));
}
}