传送门
ODT水题(当然可以上线段树)
支持区间01覆盖,询问全局1的个数。
思路:直接上ODTODTODT。
不会的点这里
代码:
#include<bits/stdc++.h>
#define ri register int
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
struct Node{
int l,r;
mutable bool v;
Node(int l_,int r_=-1,bool v_=0):l(l_),r(r_),v(v_){}
friend inline bool operator<(const Node&a,const Node&b){return a.l<b.l;}
};
set<Node>S;
int ans;
typedef set<Node>::iterator It;
inline It split(int pos){
It it=S.lower_bound(Node(pos));
if(it!=S.end()&&it->l==pos)return it;
--it;
int L=it->l,R=it->r;
bool v=it->v;
return S.erase(it),S.insert(Node(L,pos-1,v)),S.insert(Node(pos,R,v)).first;
}
inline void assign(int l,int r,bool v){
It R=split(r+1),L=split(l);
for(It it=L;it!=R;++it)ans-=it->v*(it->r-it->l+1);
S.erase(L,R),ans+=(r-l+1)*v,S.insert(Node(l,r,v));
}
int main(){
S.insert(Node(1,ans=read(),1));
for(ri tt=read(),l,r,k;tt;--tt)l=read(),r=read(),k=read()-1,assign(l,r,k),cout<<ans<<'\n';
return 0;
}