RT.
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define gc getchar()
#define pc(c) putchar(c)
using namespace std;
constexpr int N=2000007,NN=8000057;
int n,q;
struct Node{
int l,r,ll,rr,s,lz;
}tr[NN];
struct Query{
int l,r,k;
}qq[N];
int d[N],a[N],dc,ac;
inline int read(){
register int t=0,f=1;
register char c=gc;
while(c!='-'&&(c<'0'||c>'9')) c=gc;
if(c=='-') c=gc,f=-1;
while(c>='0'&&c<='9') t=10*t+(c^48),c=gc;
return f*t;
}
inline void write(int x){
if(!x) return (void)pc('0');
if(x<0) pc('-'),x=-x;
static char c[23]={""};
static int cc=0;
while(x) c[++cc]=x%10,x/=10;
while(cc) pc(c[cc--]|48);
}
inline void discrete(){
sort(d+1,d+dc+1);
for(int i=1;i<=dc;++i){
if(i==1||d[i]!=d[i-1]){
if(d[i]-a[ac]==2){
++ac;
a[ac]=a[ac-1]+1;
}
else if(d[i]-a[ac]>2){
++ac;
a[ac]=a[ac-1]+1;
++ac;
a[ac]=d[i]-1;
}
a[++ac]=d[i];
}
}
}
inline int query(int x){
return lower_bound(a+1,a+ac+1,x)-a;
}
inline void assign(int k,int v){
tr[k].s=v*(tr[k].rr-tr[k].ll+1);
tr[k].lz=v;
}
inline void pushdown(int k){
if(~tr[k].lz){
assign(k<<1,tr[k].lz);
assign(k<<1|1,tr[k].lz);
tr[k].lz=-1;
}
}
void pushup(int k){
tr[k].s=tr[k<<1].s+tr[k<<1|1].s;
tr[k].ll=tr[k<<1].ll,
tr[k].rr=tr[k<<1|1].rr;
}
void build(int k,int l,int r){
tr[k].l=l,tr[k].r=r;
tr[k].lz=-1;
if(l==r){
tr[k].ll=a[l-1]+1;
tr[k].rr=a[l];
tr[k].s=a[l]-a[l-1];
return;
}
int m=(l+r)>>1;
build(k<<1,l,m);
build(k<<1|1,m+1,r);
pushup(k);
}
void modify(int k,int l,int r,int v){
if(tr[k].l>r||tr[k].r<l){
return;
}
if(tr[k].l>=l&&tr[k].r<=r){
return assign(k,v);
}
pushdown(k);
modify(k<<1,l,r,v);
modify(k<<1|1,l,r,v);
pushup(k);
}
signed main(){
n=read(),q=read();
d[++dc]=1;
for(int i=1;i<=q;++i){
qq[i].l=read(),
qq[i].r=read(),
qq[i].k=read()-1;
d[++dc]=qq[i].l;
d[++dc]=qq[i].r;
}
d[++dc]=n;
discrete();
build(1,1,ac);
for(int i=1;i<=q;++i){
modify(1,query(qq[i].l),query(qq[i].r),qq[i].k);
pushdown(1);
write(tr[1].s),puts("");
}
return 0;
}