rt qaq
#include<bits/stdc++.h>
#define M 16300005
using namespace std;
int n,m,ls[M],rs[M],sum[M],lazy[M],tot;
int lef(int now) {
if(ls[now] != 0) return ls[now];
++tot;
return ls[now] = tot;
}
int rig(int now) {
if(rs[now] != 0) return rs[now];
++tot;
return rs[now] = tot;
}
void pushdown(int now,int L,int R) {
int mid = (L+R) / 2;
if(lazy[now] == 1) {
lazy[lef(now)] = 1 , sum[ls[now]] = 0;
lazy[rig(now)] = 1 , sum[rs[now]] = 0;
}
else if(lazy[now] == 2) {
lazy[lef(now)] = 2 , sum[ls[now]] = mid-L+1;
lazy[rig(now)] = 2 , sum[rs[now]] = R-mid;
}
lazy[now] = 0;
}
void upd(int now) {
sum[now] = sum[ls[now]]+sum[rs[now]];
}
void adda(int L,int R,int l,int r,int id) {
int mid = (L+R) / 2;
pushdown(id,L,R);
if(L == l&& R == r) sum[id] = 0 , lazy[id] = 1;
else if(r <= mid) adda(L,mid,l,r,lef(id)),upd(id);
else if(l > mid) adda(mid+1,R,l,r,rig(id)),upd(id);
else adda(L,mid,l,mid,lef(id)),adda(mid+1,R,mid+1,r,rig(id)),upd(id);
}
void addb(int L,int R,int l,int r,int id) {
int mid = (L+R) / 2;
pushdown(id,L,R);
if(L == l&& R == r) sum[id] = R-L+1 , lazy[id] = 2;
else if(r <= mid) addb(L,mid,l,r,lef(id)),upd(id);
else if(l > mid) addb(mid+1,R,l,r,rig(id)),upd(id);
else addb(L,mid,l,mid,lef(id)),addb(mid+1,R,mid+1,r,rig(id)),upd(id);
}
int opt,l,r;
int main() {
scanf("%d%d",&n,&m);
tot = 1;
while(m--) {
scanf("%d%d%d",&l,&r,&opt);
if(opt-1) adda(1,n,l,r,1);
else addb(1,n,l,r,1);
printf("%d\n",n-sum[1]);
}
return 0;
}
再开大就MLE了,现在 #18 RE