(代码无比丑陋)

//By SiriusRen
#include <cstdio>
#include <algorithm>
using namespace std;
int n,m,L,R,xx,tx,t,root[3000050],size,ans,op,inf=0x3fffffff,a[500050];
struct Treap{int ch[2],v,cnt,sz,rnd;}tr[3000050];
void Upd(int k){tr[k].sz=tr[tr[k].ch[0]].sz+tr[tr[k].ch[1]].sz+tr[k].cnt;}
void rot(int &k,bool f){int t=tr[k].ch[f];tr[k].ch[f]=tr[t].ch[!f],tr[t].ch[!f]=k,Upd(k),Upd(t),k=t;}
void ins(int &k){
if(!k){k=++size;tr[k].v=xx;tr[k].cnt=tr[k].sz=1;tr[k].rnd=rand();return;}
tr[k].sz++;
if(tr[k].v==xx){tr[k].cnt++;return;}
bool f=xx>tr[k].v;ins(tr[k].ch[f]);
if(tr[tr[k].ch[f]].rnd<tr[k].rnd)rot(k,f);
}
void del(int &k){
if(tr[k].v==tx){
if(tr[k].cnt>1)tr[k].cnt--,tr[k].sz--;
else if(tr[k].ch[0]*tr[k].ch[1]==0)k=tr[k].ch[0]+tr[k].ch[1];
else rot(k,tr[tr[k].ch[0]].rnd>=tr[tr[k].ch[1]].rnd),del(k);
}
else tr[k].sz--,del(tr[k].ch[tx>tr[k].v]);
}
void rank(int k){
if(!k)return;
if(tr[k].v==xx)ans+=tr[tr[k].ch[0]].sz;
else if(tr[k].v>xx)rank(tr[k].ch[0]);
else ans+=tr[tr[k].ch[0]].sz+tr[k].cnt,rank(tr[k].ch[1]);
}
void query(int k){
if(!k)return;
if(op==4&&tr[k].v<xx)ans=max(ans,tr[k].v),query(tr[k].ch[1]);
else if(op==4)query(tr[k].ch[0]);
else if(op==5&&tr[k].v>xx)ans=min(ans,tr[k].v),query(tr[k].ch[0]);
else query(tr[k].ch[1]);
}
void Build(int l,int r,int pos){
ins(root[pos]);if(l==r)return;
int mid=(l+r)>>1;
if(mid<t)Build(mid+1,r,pos<<1|1);
else Build(l,mid,pos<<1);
}
void Rank(int l,int r,int pos){
if(l>=L&&r<=R){rank(root[pos]);return;}
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
if(mid<L)Rank(mid+1,r,rson);
else if(mid>=R)Rank(l,mid,lson);
else Rank(l,mid,lson),Rank(mid+1,r,rson);
}
void Change(int l,int r,int pos){
del(root[pos]),ins(root[pos]);
if(l==r)return;
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
if(mid<t)Change(mid+1,r,rson);
else Change(l,mid,lson);
}
void Ask(int l,int r,int pos){
if(l>=L&&r<=R){query(root[pos]);return;}
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
if(mid<L)Ask(mid+1,r,rson);
else if(mid>=R)Ask(l,mid,lson);
else Ask(l,mid,lson),Ask(mid+1,r,rson);
}
void b_srch(){
int l=0,r=inf,Ans=0;
while(l<=r){
ans=1,xx=(l+r)>>1,Rank(1,n,1);
if(ans<=tx)Ans=xx,l=xx+1;
else r=xx-1;
}
printf("%d\n",Ans);
}
int main(){
scanf("%d%d",&n,&m);
for(t=1;t<=n;t++)scanf("%d",&a[t]),xx=a[t],Build(1,n,1);
while(m--){
scanf("%d",&op);
if(op!=3){
scanf("%d%d%d",&L,&R,&xx);
if(op==1)ans=1,Rank(1,n,1),printf("%d\n",ans);
else if(op==2)tx=xx,b_srch();
else{
ans=inf;if(op==4)ans=0;Ask(1,n,1);
printf("%d\n",ans);
}
}
else scanf("%d%d",&t,&xx),tx=a[t],Change(1,n,1),a[t]=xx;
}
}

BZOJ 3196 线段树套平衡树的更多相关文章

  1. bzoj 2120 线段树套平衡树

    先吐下槽,改了快一个小时,最后发现是SBT的delete写错了,顿时就有想死的心..... 首先对于这道题,我们应该先做一下他的小问题,bzoj1878,虽然和这道题几乎一点关系没有, 但是能给我们一 ...

  2. bzoj 1901 线段树套平衡树+二分答案查询

    我们就建一颗线段树,线段树的每一个节点都是一颗平衡树,对于每个询问来说,我们就二分答案, 查询每个二分到的mid在这个区间里的rank,然后就行了 /************************* ...

  3. bzoj 2141 线段树套平衡树

    用树套树来解决这个问题,存储每个节点的数值是多少,然后交换 对于答案的变更可以讨论下,假设交换的是x,y位置的数x<=y 如果x=y || high[x]=high[y]则对答案没有影响 如果h ...

  4. bzoj 3196/ Tyvj 1730 二逼平衡树 (线段树套平衡树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description ...

  5. 【BZOJ-3196】二逼平衡树 线段树 + Splay (线段树套平衡树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2271  Solved: 935[Submit][Stat ...

  6. CF 19D - Points 线段树套平衡树

    题目在这: 给出三种操作: 1.增加点(x,y) 2.删除点(x,y) 3.询问在点(x,y)右上方的点,如果有相同,输出最左边的,如果还有相同,输出最低的那个点 分析: 线段树套平衡树. 我们先离散 ...

  7. BZOJ3196二逼平衡树——线段树套平衡树(treap)

    此为平衡树系列最后一道:二逼平衡树您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询 ...

  8. P3380 【模板】二逼平衡树(树套树)(线段树套平衡树)

    P3380 [模板]二逼平衡树(树套树) 前置芝士 P3369 [模板]普通平衡树 线段树套平衡树 这里写的是线段树+splay(不吸氧竟然卡过了) 对线段树的每个节点都维护一颗平衡树 每次把给定区间 ...

  9. [BZOJ1146][CTSC2008]网络管理Network(二分+树链剖分+线段树套平衡树)

    题意:树上单点修改,询问链上k大值. 思路: 1.DFS序+树状数组套主席树 首先按照套路,关于k大值的问题,肯定要上主席树,每个点维护一棵权值线段树记录它到根的信息. 关于询问,就是Que(u)+Q ...

随机推荐

  1. Centos6.6 yum源更新

    1备份: cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d//CentOS-Base.repo.ori 2下载: wget -O /etc/y ...

  2. docker环境下mysql参数修改

    原文:docker环境下mysql参数修改 需要修改log_bin为on,看了好几个博客说都需要删掉容器重新生成,然而并非如此, 我们可以用docker cp 命令将docker的文件"下载 ...

  3. Axure7.0在OS X Yosemite(10.10)中不能用的问题

    电脑升级到了10.10后发现axure7.0不能使用.解决办法也非常easy,就是又一次下载一个新的axure版本号,下载地址:http://www.axure.com/release-candida ...

  4. zzulioj--1828-- 贪心的小猫咪(贪心模拟)

    1828: 贪心的小猫咪 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 14  Solved: 4 SubmitStatusWeb Board Des ...

  5. 关于nth-of-type和nth-child的关系

    一开始写样式的时候喜欢全部元素都来个class,后面发现这样一个页面下来很多个class,起名字起到发慌,然后老师说该多用 逻辑关系来写样式,就是这种第几个孩子啊这种,不知道你们有没有这种烦恼,要用的 ...

  6. 9.优先队列,priority_queue

    #include <iostream> #include <queue> #include <deque> #include <list> using ...

  7. channels2.X 学习笔记

    - No module named 'asgiref.sync' 报错解决: # 报错原因: """ django版本过低, 卸载最新版本的 channels 使用2.x ...

  8. Java基础学习(一) -- Java环境搭建、数据类型、分支循环等控制结构、简单一维数组详解

    一:java概述: 1982年,SUN公司诞生于美国斯坦福大学校园,并于1986年上市,在NASDAQ(纳斯达克:是全美证券商协会自动报价系统)的标识为SUNW,2007年改为JAVA. 2009年4 ...

  9. css五种定位方式介绍

    1.static定位(普通流定位) -------------- 默认定位 2.float定位(浮动定位) 例:float:left; 有两个取值:left(左浮动)和right(右浮动).浮动元素会 ...

  10. js数组的操作 Full

    js数组的操作 用 js有很久了,但都没有深究过js的数组形式.偶尔用用也就是简单的string.split(char).这段时间做的一个项目,用到数组的地方很多,自以为js高手的自己居然无从下手,一 ...