#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. java后台修改ZK页面的title

    Clients.evalJavaScript("document.title='"+basicDBObject.getString("systemName")+ ...

  2. Dijkstra算法——最短路径(转)

    转自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html Dijkstra算法 1.定义概览 Dijkstra(迪杰斯 ...

  3. python 变量作用域 v.__sizeof__() python 深复制 一切皆对象 尽量减少内存消耗

    python 深入理解 赋值.引用.拷贝.作用域 - 江召伟 - 博客园 https://www.cnblogs.com/jiangzhaowei/p/5740913.html a=[1,2,5]b= ...

  4. 李维对VCL理解的几个错误

    研读深入浅出VCL一书的时候,有不少地方被网友提出疑问,而且似乎是网友们正确.但这丝毫不动摇李维在大中华Delphi界的江湖地位,因为高手应该是对整个系统理解的高手,而不是对某一个疑问的高手.能花巨量 ...

  5. 容器Vector原理(学习)

    一.概述 数据结构同ArrayList,底层都是数组存储,只不过是线程同步的,也就是其 操作方法都是synchronized

  6. 【Silverlight】Bing Maps学习系列(七):使用Bing Maps的图片系统(Tile System)

    [Silverlight]Bing Maps学习系列(七):使用Bing Maps的图片系统(Tile System) 目前包括微软必应地图在内的几乎所有在线电子地图(如:Google Maps等)都 ...

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

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

  8. 【HDU 1005】 Number Sequence

    [题目链接] 点击打开链接 [算法] 矩阵乘法快速幂,即可 [代码] #include<bits/stdc++.h> using namespace std; int a,b,n; str ...

  9. Python 返回多个值+Lambda的使用

    def MaxMin(a,b): if(a>b): return a,b else: return b,a max,min=MaxMin(8,95) print "最大值为:" ...

  10. C#面向过程之局部变量、成员变量、变量作用域、可变参数

    局部变量与成员变量:  局部变量:定义在方法里面的变量就叫做局部变量:没有默认的初始值,使用变量之前必须给它赋值成员变量:定义在类下面的变量叫做成员变量:如果是数值类型默认初始值为0 如果是引用类型默 ...