传送门

珂朵莉树是个吼东西啊

这题线段树代码4k起步……珂朵莉树只要2k……

虽然因为这题数据不随机所以珂朵莉树的复杂度实际上是错的……

然而能过就行对不对……

(不过要是到时候noip我还真不敢打……毕竟CCF那机子……)

 //minamoto
#include<iostream>
#include<cstdio>
#include<set>
#include<algorithm>
#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=1e5+;
struct node{
int l,r;mutable bool v;
node(int L,int R=-,int 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,int v){
IT itr=split(r+),itl=split(l);
s.erase(itl,itr),s.insert(node(l,r,v));
}
void rev(int l,int r){
IT itr=split(r+),itl=split(l);
for(;itl!=itr;++itl) itl->v^=;
}
int sum(int l,int r){
IT itr=split(r+),itl=split(l);
int res=;
for(;itl!=itr;++itl) res+=itl->v?itl->r-itl->l+:;
return res;
}
int count(int l,int r){
int res=,tmp=;IT itr=split(r+),itl=split(l);
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();
for(int i=;i<n;++i) s.insert(node(i,i,read()));
s.insert(node(n,n,));
while(m--){
int op=read(),l=read(),r=read();
switch(op){
case :assign(l,r,);break;
case :assign(l,r,);break;
case :rev(l,r);break;
case :print(sum(l,r));break;
case :print(count(l,r));break;
}
}
return Ot(),;
}

最新文章

  1. Exchange 基本命令累计
  2. C语言中main函数的参数
  3. 15条变量&amp;方法命名的最佳实践【转】
  4. Ubuntu下的svn的安装
  5. Event-based Asynchronous Pattern Overview基于事件的异步模式概览
  6. 在 Eclipse 中使用 JSHint 检查 JavaScript 代码
  7. SQL查询数据库表字段值不为空或Null的所有列
  8. git撤销提交到remote的commit
  9. mybatis审查要点
  10. 在android源码环境下写上层应用的一个初步解决方法
  11. SSH框架-Caused by: org.hibernate.MappingException: column attribute may not be used together with &lt;column&gt; subelement
  12. c++ 积累
  13. Protege4.3 添加Rules 栏
  14. PHP基本随笔
  15. VUE2 第五天学习--过渡效果
  16. js判断一个值是空的最快方法是不是if(!value){alert(&quot;这个变量的值是null&quot;);}
  17. Javaweb学习(二):Http通信协议
  18. mvn编译
  19. 关于学习JAVA程序设计语言的回顾与展望
  20. Vue-Router路由Vue-CLI脚手架和模块化开发 之 使用props替代路由对象的方式获取参数

热门文章

  1. Linux中的进程与线程
  2. 免费SSL申请
  3. 最少拦截系统-----hdu1257(dp+最长上升子序列)
  4. Spring的JDBC框架概述
  5. Java的条件判断
  6. [PythonCode]扫描局域网的alive ip地址
  7. spring mvc 整理
  8. [Node.js] Read a File in Node.js with fs.readFile and fs.readFileSync
  9. 关于rman duplicate 一些比較重要的知识点--系列三
  10. centos编辑界面和图形界面登陆切换设置