传送门

看到区间推倒……推平就想到珂朵莉树

挖脑洞直接assign,填坑先数一遍再assign再暴力填,数数的话暴力数

 //minamoto
#include<iostream>
#include<cstdio>
#include<set>
#define IT set<node>::iterator
using std::set;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,:;}
int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
char sr[<<],z[];int C=-,Z;
inline void Ot(){fwrite(sr,,C+,stdout),C=-;}
void print(int x){
if(C><<)Ot();if(x<)sr[++C]=,x=-x;
while(z[++Z]=x%+,x/=);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
const int N=2e5+;
struct node{
int l,r;mutable bool v;
node(int L,int R=-,bool V=):l(L),r(R),v(V){}
inline bool operator <(const node &b)const
{return l<b.l;}
};set<node> s;
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;
s.erase(it),s.insert(node(l,pos-,v));
return s.insert(node(pos,r,v)).first;
}
void assign(int l,int r){
IT itr=split(r+),itl=split(l);
s.erase(itl,itr),s.insert(node(l,r,));
}
int count(int l,int r){
IT itr=split(r+),itl=split(l);int res=;
for(IT it=itl;it!=itr;++it) res+=it->v?it->r-it->l+:;
s.erase(itl,itr),s.insert(node(l,r,));
return res;
}
void fi(int l,int r,int cnt){
IT itr=split(r+),itl=split(l);
for(;itl!=itr;++itl)
if(itl->v==){
if(cnt<=itl->r-itl->l+){
if(cnt==itl->r-itl->l+) itl->v=;
else{
int ql=itl->l,qr=itl->r;
s.erase(itl),s.insert(node(ql,ql+cnt-,)),s.insert(node(ql+cnt,qr,));
}
return;
}else itl->v=,cnt-=itl->r-itl->l+;
}
}
void recov(int l,int r,int ql,int qr){
int res=count(l,r);
if(res) fi(ql,qr,res);
}
int sum(int l,int r){
IT itr=split(r+),itl=split(l);int res=,tmp=;
for(;itl!=itr;++itl)
itl->v==?(tmp+=itl->r-itl->l+):(cmax(res,tmp),tmp=);
return std::max(res,tmp);
}
int main(){
// freopen("testdata.in","r",stdin);
int n=read(),m=read();
s.insert(node(,n,));
while(m--){
int op=read(),l=read(),r=read(),ql,qr;
switch(op){
case :assign(l,r);break;
case :ql=read(),qr=read(),recov(l,r,ql,qr);break;
case :print(sum(l,r));break;
}
}
return Ot(),;
}

最新文章

  1. CSS的常见属性
  2. LeetCode之371. Sum of Two Integers
  3. GOLANG 赋值
  4. BZOJ 2898 模拟
  5. nginx服务器是怎么执行php脚本的?
  6. linux 病毒 sfewfesfs
  7. SRM 219 Div II Level One: WaiterTipping,小心约分
  8. FZU 2193 So Hard
  9. 多个input连接在一起的时候如何实现输入一个数字跳入下一个
  10. Java基础学习笔记十五 集合、迭代器、泛型
  11. sed 删除文本
  12. 2018.12/17 function 的闭包
  13. 2018-2019-1 20189201 《LInux内核原理与分析》第六周作业
  14. Sciter返回json
  15. C#自制Web 服务器开发:mysql免安装版配置步骤详解分享
  16. PAT 1032 挖掘机技术哪家强(20)(有测试样例)
  17. css的基础用法之标签选择
  18. Python 数据类型--集合(set)
  19. haproxy配置示例
  20. Windows下Java JDK8配置环境变量

热门文章

  1. ATcoder 1983 BBQ Hard
  2. java基础语法——方法,static关键字
  3. Java子类重写父类方法注意问题收集(转)
  4. 打开input输入的时候,css中position:absolute/fixed定位的时候,定位元素上移问题解决
  5. ArcGIS Engine 中的多线程使用
  6. SharePoint中取得ACL和组中用户数量
  7. 分享一个纯css制作的动画化,在网页(手机)载入等的时候能够引用!
  8. Echarts 的样例
  9. 创业公司做数据分析(四)ELK日志系统
  10. python学习第一