#include<iostream>
#include<cstdio>
#include<cstdlib>
#define INF 0x7fffffff
using namespace std ;
struct treap
{
int l,r,val,dat,cnt,size;
#define l(x) tr[x].l
#define r(x) tr[x].r
#define val(x) tr[x].val
#define dat(x) tr[x].dat
#define cnt(x) tr[x].cnt
#define size(x) tr[x].size
}tr[];
int tot,root,n; int New(int val)
{
++tot;
val(tot)=val;
dat(tot)=rand();
size(tot)=cnt(tot)=;
return tot;
}
void updata(int x)
{
size(x)=cnt(x)+size(l(x))+size(r(x));
}
void build()
{
New(-INF),New(INF);
root=;
r()=;
updata(root);
}
void zig(int &p)//you
{
int q=l(p);
l(p)=r(q);
r(q)=p;
updata(p),updata(q);
p=q;
}
void zag(int &p)//zuo
{
int q=r(p);
r(p)=l(q);
l(q)=p;
updata(p),updata(q);
p=q;
}
int grbv(int p,int val)
{
if(!p)return ;
if(val==val(p))return size(l(p))+;
if(val(p)>val) return grbv(l(p),val);
return grbv(r(p),val)+size(l(p))+cnt(p);
}
int gvbr(int p,int rank)
{
if(!p)return INF;
if(size(l(p))>=rank)return gvbr(l(p),rank);
if(size(l(p))+cnt(p)>=rank)return val(p);
return gvbr(r(p),rank-size(l(p))-cnt(p));
}
void insert(int &p,int val)
{
if(!p){p=New(val);return;}
if(val(p)==val){cnt(p)++;updata(p);return;}
if(val(p)>val)
{
insert(l(p),val);
if(dat(l(p))>dat(p))zig(p);
}
else
{
insert(r(p),val);
if(dat(r(p))>dat(p))zag(p);
}
updata(p);
}
void remove(int &p,int val)
{
if(!p)return;
if(val(p)==val)
{
if(cnt(p)>){cnt(p)--;updata(p);return;}
if(l(p) || r(p))
{
if(r(p)== || dat(l(p))>dat(r(p)))
zig(p),remove(r(p),val);
else
zag(p),remove(l(p),val);
updata(p);
}
else p=;
return;
}
val<val(p)?remove(l(p),val):remove(r(p),val);
updata(p);
}
int getpre(int val)
{
int ans=,p=root;
while(p)
{
if(val(p)==val)
{
if(l(p)>)
{
p=l(p);
while(r(p)>)p=r(p);
ans=p;
}
break;
}
if(val(p)<val && val(p)>val(ans))ans=p;
p=val<val(p)?l(p):r(p);
}
return val(ans);
}
int getnext(int val)
{
int ans=,p=root;
while(p)
{
if(val(p)==val)
{
if(r(p)>)
{
p=r(p);
while(l(p)>)p=l(p);
ans=p;
}
break;
}
if(val(p)>val && val(p)<val(ans))ans=p;
p=val<val(p)?l(p):r(p);
}
return val(ans);
}
signed main()
{
// freopen("input2.in","r",stdin); build();
cin>>n;
int opt,x;
for(int i=;i<=n;i++)
{
cin>>opt>>x;
if(opt==)insert(root,x);
if(opt==)remove(root,x);
if(opt==)cout<<grbv(root,x)-<<endl;
if(opt==)cout<<gvbr(root,x+)<<endl;
if(opt==)cout<<getpre(x)<<endl;
if(opt==)cout<<getnext(x)<<endl;
}
}

模板—treap的更多相关文章

  1. 模板——Treap

    不得不说平衡树博大精深,除了Treap,还有splay,非旋Treap和可持久化数据结构,今天先讲讲Treap,也很感谢这位大佬的博客给予我帮助:http://www.360doc.com/conte ...

  2. [模板] Treap

    插入x 删除x 查询排名为x的数 查询x的排名 求x的前驱.后继 //Stay foolish,stay hungry,stay young,stay simple #include<iostr ...

  3. 模板——Treap实现名次树

    Treap 是一种通过赋予结点随机权值的一种满足堆性质的二叉搜索树,它很好的解决了二叉搜索树顺序插入组成链式的局限性. 名次树是指在treap的每个结点中添加附加域size,表示以它为根的子树的总结点 ...

  4. LG3369 普通平衡树

    题意 维护一些数,其中需要提供以下操作: 1.插入\(x\) 2.删除\(x\)(若有多个相同的数,只删除一个) 3.查询\(x\)的排名(排名定义为比当前数小的数的个数\(+1\)) 4.查询排名为 ...

  5. treap树模板

    ///treap树模板 typedef struct Node ///节点的结构体 { Node *l,*r; int val,pri; ///节点的值和优先级 int sz; ///节点子树的节点数 ...

  6. BZOJ 3224 TYVJ 1728 普通平衡树 [Treap树模板]

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 7390  Solved: 3122 [Submit][S ...

  7. 三大平衡树(Treap + Splay + SBT)总结+模板[转]

    Treap树 核心是 利用随机数的二叉排序树的各种操作复杂度平均为O(lgn) Treap模板: #include <cstdio> #include <cstring> #i ...

  8. treap完全版模板

    这是我综合poj1442 3481 2352的treap操作 得到treap完全版模板.(经测AC) 结构体Tree { int key; //键值 int size; //该子树总节点个数 int ...

  9. Treap 模板 poj1442&hdu4557

    原理可以看hihocoder上面的讲解,很清楚,不多说了. 模板抄lrj训练指南上面的. /** Treap 实现 名次树 功能: 1.找到排名为k的元素 2.值为x的元素的名次 初始化:Node* ...

随机推荐

  1. 2016/2/18 html 图片热点,网页划区,拼接,表单

    ①图片热点 规划出图片上的一个区域,可以做出超链接,直接点击图片区域就可以完成跳转的效果. 显示 ②网页划区 在一个网页里,规划出一个区域用来展示另一个网页的内容. ③网页拼接 在一个网络页面内,规划 ...

  2. Run bash script as daemon

    linux - Run bash script as daemon - Stack Overflow https://stackoverflow.com/questions/19233529/run- ...

  3. Linux/Android——Input系统之frameworks层InputManagerService (六)【转】

    本文转载自:http://blog.csdn.net/u013491946/article/details/72638954 版权声明:免责声明: 本人在此发文(包括但不限于汉字.拼音.拉丁字母)均为 ...

  4. Bing Maps进阶系列九:使用MapCruncher进行地图切片并集成进Bing Maps

    Bing Maps进阶系列九:使用MapCruncher进行地图切片并集成进Bing Maps 在Bing Maps开发中,由于各种应用功能的不同,更多的时候用户可能需要将自己的一部分图片数据作为地图 ...

  5. xubuntu 17.04 和 iphone 6互传文件方法——使用libimobiledevice就可以像u盘一样操作文件了

    I need to preface this by saying I'm also new to Linux, but I've got it working I think. The instruc ...

  6. 【HAOI 2007】 理想的正方形

    [题目链接] 点击打开链接 [算法] 单调队列 [代码] #include<bits/stdc++.h> using namespace std; #define MAXN 1010 co ...

  7. EasyUI Form表单提交

    转自:https://www.cnblogs.com/net5x/articles/4576926.html Form(表单) 使用$.fn.form.defaults重写默认值对象 form提供了各 ...

  8. css实现左边div固定宽度,右边div自适应撑满剩下的宽度

    (1)使用float <div class="use-float"> <div></div> <div></div> & ...

  9. 技嘉,u盘安装win7,提示“找不到驱动器设备驱动程序”

    错误图: 解决办法: 网上说什么换usb2.0,修复用命令启动芸芸,反正对我来说没发现有什么卵用 详细步骤: 点击进入详细步骤页面地址

  10. HTML和JSP的不同及优缺点

    HTML(Hypertext Markup Language)文本标记语言,它是静态页面,和JavaScript一样解释性语言,为什么说是解释性语言呢?因为,只要你有一个浏览器那么它就可以正常显示出来 ...