洛谷3835

 #include<cstdio>
#include<algorithm>
#include<cstdlib>
#define ls (a[u].l)
#define rs (a[u].r)
#define R (root[Ver])
#define update(u) (a[u].size=a[a[u].l].size+a[a[u].r].size+1)
#define copy(x) (a[++tot]=a[x],a[x=tot].ver=Ver)
using namespace std;
int Ver,ver,Opt,Val,n,x,y,z,tot,root[];
struct treap{int l,r,val,rnd,size,ver;}a[];
inline void read(int &k){
k=; int f=; char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(''<=c&&c<='')k=k*+c-'',c=getchar();
k*=f;
}
inline void put(int x){
if(x<) putchar('-'),x=-x;
char s[]; int k=,y=;
while(x>){
y=x; x/=;
s[++k]=y-x*+;
}
for (int i=k;i>=;i--) putchar(s[i]);
puts(y?"":"");
}
inline void newnode(int val){a[++tot]=(treap){,,val,rand(),,Ver};}
void split(int u,int k,int &x,int &y){
if(!k){x=; y=u; return;}
if(a[u].size==k){x=u; y=; return;}
if (a[u].ver<Ver) copy(u);
if(a[ls].size>=k) split(ls,k,x,ls),y=u;
else split(rs,k-a[ls].size-,rs,y),x=u;
update(u);
}
int merge(int x,int y){//x较小树,y较大树
if ((!x)||(!y)) return x+y;
if(a[x].rnd<a[y].rnd){if (a[x].ver<Ver) copy(x); a[x].r=merge(a[x].r,y); update(x); return x;}
else{if (a[y].ver<Ver) copy(y); a[y].l=merge(x,a[y].l); update(y); return y;}
}
int qrank(int u,int val){
if(!u) return ;
return a[u].val>=val?qrank(ls,val):qrank(rs,val)+a[ls].size+;
}
int qval(int u,int rank){
if(a[ls].size+==rank) return a[u].val;
return a[ls].size>=rank?qval(ls,rank):qval(rs,rank-a[ls].size-);
}
int main(){
srand(); a[root[]=tot=]=(treap){,,<<,-,,};
read(n);
for(Ver=;Ver<=n;Ver++){
read(ver); R=root[ver];
read(Opt); read(Val);
if(Opt==){split(R,qrank(R,Val),x,y); newnode(Val); R=merge(merge(x,tot),y);}//插入
if(Opt==){//删除
int tmp=qrank(R,Val);
if (qval(R,tmp+)!=Val) continue;
split(R,tmp,x,y); split(y,,z,y); R=merge(x,y);
}
if(Opt==) put(qrank(R,Val)+);//求x的排名
if(Opt==) put(qval(R,Val));//求排名为x的数
if(Opt==){//求x的前驱
int tmp=qrank(R,Val);
if(tmp) put(qval(R,tmp)); else puts("-2147483647");
}
if(Opt==){//求x的后继
int tmp=qrank(R,Val+);
if(tmp<a[R].size) put(qval(R,tmp+)); else puts("");
}
}
return ;
}

最新文章

  1. POJ3162 Walking Race(树形DP+尺取法+单调队列)
  2. imx6 RGB LCD
  3. Oracle NULL 和空值
  4. 【多端应用开发系列1.1.1 —— Android:使用新浪API V2】服务器Json数据处理——Json数据概述
  5. [Effective C++ --020]宁以pass-by-reference-to-const替换pass-by-value
  6. 归并排序算法(C#实现)
  7. 【转】我的电脑最近忽然开不了机,启动修复也无法修复,win7系统。开机的时候如果不点启动修复直接正常启动
  8. hdu 1199 Color the Ball(离散化线段树)
  9. js图片实时加载
  10. jQuery 查询 xml
  11. [转载]linux下编译php中configure参数具体含义
  12. SDN网络中hypervisor带来的控制器时延(Hypervisor位置的优化)
  13. 细述:nginx http内核模块提供的变量和解释
  14. C# 构造函数中base和this的使用。
  15. ZooKeeper 分布式锁
  16. oracle之存储过程和存储函数的使用和区别
  17. Cocos2d-x 3.0新引擎文件夹结构
  18. BZOJ 1500: [NOI2005]维修数列 (splay tree)
  19. eclipse开发php的插件
  20. BZOJ4831: [Lydsy1704月赛]序列操作(非常nice的DP&amp; 贪心)

热门文章

  1. 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 数据库连接不释放测试 连接池 释放连接 关闭连接 有关 redis-py 连接池会导致服务器产生大量 CLOSE_WAIT 的再讨论以及一个解决方案
  2. Android:解决Gradle DSL method not found: &#39;runProguard()&#39; 问题
  3. IDEA Spark Streaming Kafka数据源-Consumer
  4. codevs1040统计单词个数(区间+划分型dp)
  5. Nginx 配置https请求
  6. python django简单操作
  7. ansible基础知识
  8. php 获取客户端的真实ip地址 通过第三方网站
  9. [转]linux之top命令
  10. [ NOI 2005 ] 聪聪与可可