网上有许多题,就是给定一个序列,要你支持几种操作: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。
//copy from cocoppp
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cmath>
#define F(i,j,n) for(int i=j;i<=n;i++)
#define pa pair<int,int>
#define maxn 50005
#define INF 1000000000
using namespace std;
int n,m,rt=,tot=;
int a[maxn],fa[maxn],t[maxn][],mx[maxn],tag[maxn],size[maxn];
bool rev[maxn];
inline int read()
{
int ret=,flag=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-') flag=-;ch=getchar();}
while (ch>=''&&ch<=''){ret=ret*+ch-'';ch=getchar();}
return ret*flag;
}
inline void pushup(int k)
{
int l=t[k][],r=t[k][];
mx[k]=max(max(mx[l],mx[r]),a[k]);
size[k]=size[l]+size[r]+;
}
inline void pushdown(int k)
{
int l=t[k][],r=t[k][],tg=tag[k];
if (tg)
{
tag[k]=;
if (l){tag[l]+=tg;mx[l]+=tg;a[l]+=tg;}
if (r){tag[r]+=tg;mx[r]+=tg;a[r]+=tg;}
}
if (rev[k])
{
rev[k]=;
rev[l]^=;rev[r]^=;
swap(t[k][],t[k][]);
}
}
inline void rotate(int &k,int x)
{
int y=fa[x],z=fa[y],l,r;
if (t[y][]==x) l=; else l=;r=l^;
if (k==y) k=x;
else{if (t[z][]==y) t[z][]=x;else t[z][]=x;}
fa[x]=z; fa[y]=x;
fa[t[x][r]]=y;
t[y][l]=t[x][r];t[x][r]=y;
pushup(y);pushup(x);
}
inline void splay(int &k,int x)
{
while (x!=k){
int y=fa[x],z=fa[y];
if (y!=k){
if ((t[y][]==x)^(t[z][]==y)) rotate(k,x);
else rotate(k,y);
}
rotate(k,x);
}
}
inline int find(int k,int rank)
{
if (tag[k]||rev[k]) pushdown(k);
int l=t[k][],r=t[k][];
if (size[l]+==rank) return k;
else if (size[l]>=rank) return find(l,rank);
else return find(r,rank-size[l]-);
}
inline void add(int l,int r,int val)
{
int x=find(rt,l),y=find(rt,r+);
splay(rt,x);
splay(t[x][],y);
int z=t[y][];
tag[z]+=val;mx[z]+=val;a[z]+=val;
}
inline void reverse(int l,int r)
{
int x=find(rt,l),y=find(rt,r+);
splay(rt,x);splay(t[x][],y);
rev[t[y][]]^=;
}
inline void query(int l,int r)
{
int x=find(rt,l),y=find(rt,r+);
splay(rt,x); splay(t[x][],y);
printf("%d\n",mx[t[y][]]);
}
inline void build(int l,int r,int last)
{
if (l==r){
fa[l]=last;size[l]=;
if (l<last) t[last][]=l;
else t[last][]=l;
return;
}
int mid=(l+r)>>;
build(l,mid-,mid);build(mid+,r,mid);
fa[mid]=last;pushup(mid);
if (mid<last) t[last][]=mid;
else t[last][]=mid;
}
int main()
{
mx[]=-INF;
n=read(); m=read();
build(,n+,);
rt=(n+)>>;
F(i,,m){
int opt=read(),l=read(),r=read(),val;
if (top==){val=read();add(l,r,val);}
else if (opt==) reverse(l,r);
else query(l,r);
}
return ;
}

BZOJ1251 序列终结者(Splay平衡树)(占位)的更多相关文章

  1. [bzoj1251]序列终结者——splay

    题目大意 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技 ...

  2. bzoj1251 序列终结者(splay)

    人生第一发splay,写得巨丑,最后忘记了push_down以后要将子节点maintain 9k代码不忍直视 #define NDEBUG #include<cstdio> #includ ...

  3. [BZOJ1251]序列终结者

    [BZOJ1251]序列终结者 试题描述 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题 ...

  4. 【BZOJ1251】序列终结者 Splay

    一道模板题,一直没发现自己的快速读入读不了负数,我竟然能活到现在真是万幸. #include <iostream> #include <cstdio> #define inf ...

  5. bzoj1251 序列终结者(Splay Tree+懒惰标记)

    Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这 ...

  6. 1251. 序列终结者【平衡树-splay】

    Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这 ...

  7. [bzoj1251]序列终结者_splay

    序列终结者 bzoj-1251 题目大意:给定一个长度为n的正整数序列,支持区间加,区间反转,查询区间最大值.所有元素开始都是0. 注释:$1\le n\le 5\cdot 10^4$,操作个数不多于 ...

  8. BZOJ 1251: 序列终结者 [splay]

    1251: 序列终结者 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3778  Solved: 1583[Submit][Status][Discu ...

  9. CODEVS 4655 序列终结者-splay(区间更新、区间翻转、区间最值)

    4655 序列终结者  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解       题目描述 Description 网上有许多题,就是给定一个序列,要 ...

随机推荐

  1. XMPP系列(三)---获取好友列表、加入好友

    1.心跳检測.掉线重连功能 client和server端都能够设置多久发送一次心跳包,假设对方没有返回正确的pong信息,则会断开连接,而加入掉线重连功能,则会自己主动进行连接. 假设自己写聊天功能还 ...

  2. Arrays.asList引起的java.lang.UnsupportedOperationException解决方法

    在项目中对List进行操作时报错java.lang.UnsupportedOperationException,后来发现操作的List是由数组转换而成的,通过看源码发现问题,并写测试程序如下. 代码块 ...

  3. 向oracle中插入date时,持久层sql怎么写???

    public class EmpDao { public void addEmp(Emp emp) throws SQLException { QueryRunner runner = new Que ...

  4. 21-nginx单机1W并发优化

    一:优化思路 (1)建立socket连接 (2)打开文件,并沿socket返回.二:优化  (1) 修改nginx.conf 进程数量 默认是1024 改成20140 worker_rlimit_no ...

  5. Android - 使用messager实现进程间通信(服务器端→客户端,客户端→服务器端双向)

    之前看了一篇,然后不自己动手肯定是不行的,然后自己又写了一遍. 背景: 一般使用messenger进行进程间通信的时候,我们只能进行单方向通信.但是有没有办法让服务器端和客户端进行双向通信呢? 解决思 ...

  6. doT.js具体使用介绍

    官网: http://olado.github.iodoT.js具体使用介绍 用法: {{= }} for interpolation {{ }} for evaluation {{~ }} for ...

  7. 两个DataGridEHToExcel

    procedure TForm1.N1Click(Sender: TObject); var    GridtoExcel: TDBGridEhToExcel; begin    try    Gri ...

  8. 【BZOJ2989】数列 kd-tree

    [BZOJ2989]数列 Description 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[y]| ...

  9. Vue设置导航栏为公共模块并在登录页不显示

    1.公共模块的内容可以放在App.vue中但是通常登录页面是不需要导航的,那么就需要规避登录页这时,就可以采用keep-alive结合$route.meta来实现这个功能.keep-alive 是 V ...

  10. 箭头函数 this arrow function 无this

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions import w ...