flowerletter @ 2018-12-25 12:09:59
#include <bits/stdc++.h>
using namespace std;
#define lson tree[x].son[0]
#define rson tree[x].son[1]
#define Int register int
const int MAXN = 50010;
const int inf = 1<<30;
int n,q,root,tot;
struct fhq_Treap{
int rnd,Max,sum,delta,lazy,size,son[2];
}tree[MAXN];
inline int read(){
int x=0,f=1;char c=getchar();
while(c<'0' || c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0' && c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
inline void Add_One(int x,int delta){tree[x].sum+=delta; tree[x].delta+=delta; tree[x].Max+=delta;}
inline void Reverse_One(int x){tree[x].lazy^=1;swap(lson,rson);}
inline void Up(int x){
if(!x) return ;
tree[x].Max=max(tree[x].sum,max(tree[lson].Max,tree[rson].Max)),
tree[x].size=tree[lson].size+tree[rson].size+1;
}
inline void Down(int x){
if(!x) return ;
if(tree[x].delta) Add_One(lson,tree[x].delta),Add_One(rson,tree[x].delta);
if(tree[x].lazy) Reverse_One(lson),Reverse_One(rson);
tree[x].delta=tree[x].lazy=0;
}
inline void Merge(int &x,int l,int r){
if(!l || !r) x=l+r;
else if(tree[l].rnd<tree[r].rnd) Down(x=l),Merge(rson,rson,r),Up(x);
else Down(x=r),Merge(lson,l,lson),Up(x);
}
inline void Split(int x,int &l,int &r,int k){
if(!k) l=0,r=x;
else if(k==tree[x].size) l=x,r=0;
else if(k<=tree[lson].size) Down(r=x),Split(lson,l,lson,k),Up(x);
else Down(l=x),Split(rson,rson,r,k-tree[lson].size-1),Up(x);
}
inline void Add(int l,int r,int delta){
int x,y,z;
Split(root,x,y,r),Split(x,z,x,l-1);
Add_One(x,delta);
Merge(x,z,x),Merge(root,x,y);
}
inline void Reverse(int l,int r){
int x,y,z;
Split(root,x,y,r),Split(x,z,x,l-1);
Reverse_One(x);
Merge(x,z,x),Merge(root,x,y);
}
inline int Query(int l,int r){
int x,y,z,ans;
Split(root,x,y,r),Split(x,z,x,l-1);
ans=tree[x].Max;
Merge(x,z,x),Merge(root,x,y);
return ans;
}
int main(){
srand(1021+1314);
n=read(),q=read();tree[0].rnd=inf,tree[0].sum=tree[0].Max=-inf;
for(int i=1;i<=n;i++) tree[++tot].size=1,tree[tot].rnd=rand()<<15|rand(),Merge(root,root,tot);
for(int i=1;i<=q;i++){
int op=read();
if(op==1) Add(read(),read(),read());
else if(op==2) Reverse(read(),read());
else printf("%d\n",Query(read(),read()));
}
return 0;
}
by flowerletter @ 2018-12-25 12:31:48
找到错了,此贴已沉,完美撒花
by flowerletter @ 2020-11-19 19:13:35
撒花!
by flowerletter @ 2020-11-19 19:13:47
花花!