rt,wa, found '50000000'.
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct {
struct Node {
int sum,tag;
int l=0,r=0;
}tree[(int)15e5+10];
int psz=1;
int get(int& u) {
return (u?u:u=++psz);
}
void pushup(int u) {
tree[u].sum=tree[tree[u].l].sum+tree[tree[u].r].sum;
}
void pushdown(int u,int l,int r) {
if(tree[u].tag) {
int tag = tree[u].tag;
tree[get(tree[u].l)].sum=(tag==1)*((l+r)/2-l+1);
tree[get(tree[u].r)].sum=(tag==1)*(r-(l+r)/2);
tree[get(tree[u].l)].tag=tag;
tree[get(tree[u].r)].tag=tag;
tree[u].tag=0;
}
}
void modify(int u,int l,int r,int s,int t,int x) {
int mid=(l+r)>>1;
if(s<=l&&r<=t) {
tree[u].sum=x?r-l+1:0;
tree[u].tag=x?1:-1;
return;
}
pushdown(u,l,r);
if(s<=mid) modify(get(tree[u].l), l, mid, s, t, x);
if(t>mid) modify(get(tree[u].r), mid+1, r, s ,t ,x);
pushup(u);
}
int query(int u,int l,int r,int s,int t) {
if(s<=l&&r<=t) return tree[u].sum;
int mid=(l+r)>>1;
int ret = 0;
pushdown(u,l,r);
if(s<=mid) if(tree[u].l) ret+=query(get(tree[u].l), l, mid, s, t);
if(t> mid) if(tree[u].r) ret+=query(get(tree[u].r), mid+1, r, s, t);
return ret;
}
} tree;
char *p1,*p2,buf[100000];
#define nc() (p1==p2 && (p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
int read()
{
int x=0,f=1;
char ch=nc();
while(ch<48||ch>57)
{
if(ch=='-')
f=-1;
ch=nc();
}
while(ch>=48&&ch<=57)
x=x*10+ch-48,ch=nc();
return x*f;
}
void write(int x)
{
if(x<0)
putchar('-'),x=-x;
if(x>9)
write(x/10);
putchar(x%10+'0');
return;
}
main() {
int n,q;
n=read(), q=read();
while(q--) {
int l,r,op;
l=read(),r=read(),op=read();
if(op==1) {
tree.modify(1,1,n,l,r,1);
}
else if(op==2) {
tree.modify(1,1,n,l,r,0);
}else{
write(tree.query(1,1,n,l,r));
puts("");
}
write(n-tree.tree[1].sum);
puts("");
}
}