Description

网上有许多题,就是给定一个序列,要你支持几种操作:A、B、C、D。一看另一道题,又是一个序列 要支持几种操作:D、C、B、A。尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技术含量……这样 我也出一道题,我出这一道的目的是为了让大家以后做这种题目有一个“库”可以依靠,没有什么其他的意思。这道题目 就叫序列终结者吧。 【问题描述】 给定一个长度为N的序列,每个序列的元素是一个整数(废话)。要支持以下三种操作: 1. 将[L,R]这个区间内的所有数加上V。 2. 将[L,R]这个区间翻转,比如1 2 3 4变成4 3 2 1。 3. 求[L,R]这个区间中的最大值。 最开始所有元素都是0。

Input

第一行两个整数N,M。M为操作个数。 以下M行,每行最多四个整数,依次为K,L,R,V。K表示是第几种操作,如果不是第1种操作则K后面只有两个数。

Output

对于每个第3种操作,给出正确的回答。

Sample Input

4 4
1 1 3 2
1 2 4 -1
2 1 3
3 2 4

Sample Output

2
【数据范围】
N<=50000,M<=100000。

splay区间操作模板

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
#define MAXN (1000000+10)
using namespace std;
int Father[MAXN];
int Son[MAXN][];
int Key[MAXN];
int Size[MAXN];
int Root,sz,n,m;
int Max[MAXN],Val[MAXN],Add[MAXN],Rev[MAXN];
using namespace std; inline int Get(int x)
{
return Son[Father[x]][]==x;
} inline void Update(int x)
{
Size[x]=Size[Son[x][]]+Size[Son[x][]]+;
Max[x]=max(Val[x],max(Max[Son[x][]],Max[Son[x][]]));
} inline void Pushdown(int x)
{
if (Add[x])
{
if (Son[x][])
{
Max[Son[x][]]+=Add[x];
Val[Son[x][]]+=Add[x];
Add[Son[x][]]+=Add[x];
}
if (Son[x][])
{
Max[Son[x][]]+=Add[x];
Val[Son[x][]]+=Add[x];
Add[Son[x][]]+=Add[x];
}
Add[x]=;
}
if (Rev[x])
{
Rev[x]=;
swap(Son[x][],Son[x][]);
Rev[Son[x][]]^=;
Rev[Son[x][]]^=;
}
} inline void Rotate(int x)
{
Pushdown(Father[x]);
Pushdown(x);
int wh=Get(x);
int fa=Father[x],fafa=Father[fa];
Son[fa][wh]=Son[x][wh^];
Father[fa]=x;
if (Son[fa][wh]) Father[Son[fa][wh]]=fa;
Son[x][wh^]=fa;
Father[x]=fafa;
if (fafa) Son[fafa][Son[fafa][]==fa]=x;
Update(fa);
Update(x);
} inline void Splay(int x,int tar)
{
for (int fa;(fa=Father[x])!=tar;Rotate(x))
if (Father[fa]!=tar)
Rotate(Get(fa)==Get(x)?fa:x);
if (!tar) Root=x;
} void Build(int l,int r,int fa)
{
if (l>r) return;
if (l==r)
{
Size[l]=;
Father[l]=fa;
Son[fa][l>fa]=l;
return;
}
int mid=(l+r)>>;
Build(l,mid-,mid);
Build(mid+,r,mid);
Father[mid]=fa;
Son[fa][mid>fa]=mid;
Update(mid);
} int Findx(int x)
{
int now=Root;
while ()
{
Pushdown(now);
if (Size[Son[now][]]>=x)
now=Son[now][];
else
{
x-=Size[Son[now][]];
if (x==)
{
Splay(now,);
return now;
}
x--;
now=Son[now][];
}
}
} inline int Split(int x,int y)
{
int xx=Findx(x),yy=Findx(y);
Splay(xx,);
Splay(yy,xx);
return Son[yy][];
} int main()
{
int p,l,r,x;
scanf("%d%d",&n,&m);
Build(,n+,);
Root=(n+)>>;
Max[]=-0x7fffffff;
for (int i=;i<=m;++i)
{
scanf("%d",&p);
if (p==)
{
scanf("%d%d%d",&l,&r,&x);
int node=Split(l,r+);
Val[node]+=x;
Max[node]+=x;
Add[node]+=x;
}
if (p==)
{
scanf("%d%d",&l,&r);
int node=Split(l,r+);
Rev[node]^=;
}
if (p==)
{
scanf("%d%d",&l,&r);
int node=Split(l,r+);
printf("%d\n",Max[node]);
}
}
}

最新文章

  1. jQuery简单实现iframe的高度根据页面内容自适应的方法(转)
  2. .NET 4.5+项目迁移.NET Core的问题记录
  3. SQLLDR记录数与文本记录数比较
  4. HDU-1011 Starship Troopers (树形DP+分组背包)
  5. SharePoint咨询师之路:设计之前的那些事二:规模
  6. 【Android学习之旅】1、Android入门介绍
  7. .Net下的进程间的通讯 -- Windows消息队列
  8. JAVA try-catch-finally-return
  9. Mysql高级之触发器
  10. Mvc分页组件MvcSimplePager代码重构及使用
  11. Mac OS X更新VirtualBox以后Genymotion无法启动的一种情况
  12. .NET Core RSA密钥的xml、pkcs1、pkcs8格式转换和JavaScript、Java等语言进行对接
  13. charles-web端开发者实用功能点
  14. redis 初步认识三(设置登录密码)
  15. Mysql数据的增删改查
  16. java程序员随笔
  17. Java 动态生成 PDF 文件
  18. 洛谷P3613 睡觉困难综合征(LCT,贪心)
  19. ES6
  20. 关于Vue的component制作dialog组件

热门文章

  1. 如鹏网学习笔记(四).Net常用类库
  2. 关于Java中语句符号及格式的理解
  3. 骆驼拼写法(CamelCase)
  4. UNIX 高手的另外 10 个习惯
  5. 教程:RSS全文输出,自己动手做。(一)
  6. redux、immutablejs和mobx性能对比(一)
  7. 【代码笔记】iOS-DropDownDemo-下拉按钮效果
  8. drupal7 formAPI给元素加css样式
  9. 新电脑装不了win7?来试试我的方法!
  10. JavaWeb学习—思维导图