#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
const int maxn=500009;
const int oo=2147483647; int T;
int nn=0;
int ch[maxn*50][2]={0},siz[maxn*50]={0},pri[maxn*50]={0},ky[maxn*50]={0};
int root[maxn]={0}; void pushup(int x){
siz[x]=siz[ch[x][0]]+siz[ch[x][1]]+1;
}
int NewNode(int val){
int x=++nn;
ky[x]=val;
siz[x]=1;
pri[x]=rand();
return x;
}
int CopyNode(int y){
int x=++nn;
ch[x][0]=ch[y][0];
ch[x][1]=ch[y][1];
pri[x]=pri[y];
siz[x]=siz[y];
ky[x]=ky[y];
return x;
} int Mer(int x,int y){
if((!x)||(!y))return x+y;
if(pri[x]<pri[y]){
int p=CopyNode(x);
ch[p][1]=Mer(ch[p][1],y);
pushup(p);
return p;
}else{
int p=CopyNode(y);
ch[p][0]=Mer(x,ch[p][0]);
pushup(p);
return p;
}
} void Split(int now,int k,int &x,int &y){
if(!now){
x=y=0;
}else{
if(ky[now]<=k){
x=CopyNode(now);
Split(ch[x][1],k,ch[x][1],y);
pushup(x);
}else{
y=CopyNode(now);
Split(ch[y][0],k,x,ch[y][0]);
pushup(y);
}
}
} void Del(int &rt,int val){
int x,y,z;
Split(rt,val,x,z);
Split(x,val-1,x,y);
y=Mer(ch[y][0],ch[y][1]);
rt=Mer(Mer(x,y),z);
}
void Ins(int &rt,int val){
int x,y,z;
Split(rt,val,x,y);
rt=Mer(Mer(x,NewNode(val)),y);
}
int Kth(int x,int k){
while(x){
int l=ch[x][0];
if(k<=siz[l]){
x=ch[x][0];
}else if(k>siz[l]+1){
k-=(siz[l]+1);
x=ch[x][1];
}else{
return ky[x];
}
}
}
int Rank(int x,int val){
int ret=0;
while(x){
if(ky[x]<val){
ret+=siz[ch[x][0]]+1;
x=ch[x][1];
}else if(ky[x]>val){
x=ch[x][0];
}else{
ret+=siz[ch[x][0]];break;
}
}
return ret+1;
}
int Getpre(int x,int val){
int ret=oo;
while(x){
if(ky[x]<val){
ret=ky[x];
x=ch[x][1];
}else{
x=ch[x][0];
}
}
return ret;
}
int Getsuc(int x,int val){
int ret=-oo;
while(x){
if(ky[x]>val){
ret=ky[x];
x=ch[x][0];
}else{
x=ch[x][1];
}
}
return ret;
} void check(int x){
if(ch[x][0])check(ch[x][0]);
cout<<ky[x]<<' ';
if(ch[x][1])check(ch[x][1]);
} int main(){
scanf("%d",&T);
for(int i=1;i<=T;++i){
int opty,pre,a;
scanf("%d%d%d",&pre,&opty,&a);
root[i]=root[pre];
if(opty==1)Ins(root[i],a);
if(opty==2)Del(root[i],a);
if(opty==3)printf("%d\n",Rank(root[i],a));
if(opty==4)printf("%d\n",Kth(root[i],a));
if(opty==5)printf("%d\n",Getpre(root[i],a));
if(opty==6)printf("%d\n",Getsuc(root[i],a));
// check(root[i]);
// cout<<endl;
}
return 0;
}

  

luogu P3835 【模板】可持久化平衡树的更多相关文章

  1. luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树)(主席树)

    luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目 #include<iostream> #include<cstdlib> #include< ...

  2. luoguP3835 [模板]可持久化平衡树

    https://www.luogu.org/problemnew/show/P3835 因为博主精力和实力有限,学不懂 fhq treap 了,因此只介绍 leafy tree 解法 leafy tr ...

  3. 洛谷.3835.[模板]可持久化平衡树(fhq treap)

    题目链接 对每次Merge(),Split()时产生的节点都复制一份(其实和主席树一样).时间空间复杂度都为O(qlogq).(应该更大些 因为rand()?内存真的爆炸..) 对于无修改的操作实际上 ...

  4. 2021.07.02 P1383 高级打字机题解(可持久化平衡树)

    2021.07.02 P1383 高级打字机题解(可持久化平衡树) 分析: 从可以不断撤销并且查询不算撤销这一骚操作可以肯定这是要咱建一棵可持久化的树(我也只会建可持久化的树,当然,还有可持久化并查集 ...

  5. Luogu P3835 【模板】可持久化平衡树(fhq Treap)

    P3835 [模板]可持久化平衡树 题意 题目背景 本题为题目普通平衡树的可持久化加强版. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本 ...

  6. [Luogu 3835]【模板】可持久化平衡树

    Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本): 插入x数 删除x数(若有多个相同的数,因只删除一个,如果没有请忽略该操作 ...

  7. 洛谷P3835 【模板】可持久化平衡树

    题目背景 本题为题目 普通平衡树 的可持久化加强版. 数据已经经过强化 感谢@Kelin 提供的一组hack数据 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作( ...

  8. P3835 【模板】可持久化平衡树

    题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本): 插入x数 删除x数(若有多个相同的数,因只删除一个,如果没有请忽略该操作) 查询x数的 ...

  9. [luogu P3369]【模板】普通平衡树(Treap/SBT)

    [luogu P3369][模板]普通平衡树(Treap/SBT) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删 ...

  10. 数组splay ------ luogu P3369 【模板】普通平衡树(Treap/SBT)

    二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) #include <cstdio> #define Max 100005 #define Inline _ ...

随机推荐

  1. sqlserver插入图片数据

    -- 插入 insert into [CHOLPOR].[dbo].[t_image](id, name) select '1', BulkColumn from openrowset(bulk N' ...

  2. 五十八、SAP中常用预定义数据类型

    一.SAP中常用预定义数据类型 注意事项如下: 1.默认的定义数据类型是CHAR. 2.取值的时候C型默认从左取,N型从右取,超过定义长度则截断. 3.C类型,可以赋值数值,也可以赋值字符,还可以混合 ...

  3. OIer常见问题与错误总结

    作为一名OIer,无论是一名刚入门的蒟蒻,还是叱诧风云的神犇,相信都会难免去犯一些错误(废话不犯错误岂不是都满分了(ノへ ̄.).在这里总结了一些OIer常见易犯的错误,与大家共勉. 1.正常错误 可能 ...

  4. RDD转为Dataset如何指定schema?

    与RDD进行互操作 Spark SQL支持两种不同方法将现有RDD转换为Datasets.第一种方法使用反射来推断包含特定类型对象的RDD的schema.这种基于反射的方法会导致更简洁的代码,并且在编 ...

  5. 前端ajax用post方式提交json数据给后端时,网络报错 415

    项目框架:spring+springmvc+mybatis 问题描述:前端ajax用post方式提交json数据给后端时,网络报错 415 前端异常信息:Failed to load resource ...

  6. mybatis今年笔记

    1.读取配置文件:用的就是解析Xml文件的技术 2.mybatis是支持自己写dao层的,但是没有必要. mybatis做的事情: 第一个创建代理对象,第二个在代理对象中调用方法. 3.相同的注解如果 ...

  7. P 1025 链表反转

    转跳点:

  8. UVA - 10954 Add All (全部相加)(Huffman编码 + 优先队列)

    题意:有n(n <= 5000)个数的集合S,每次可以从S中删除两个数,然后把它们的和放回集合,直到剩下一个数.每次操作的开销等于删除的两个数之和,求最小总开销.所有数均小于10^5. 分析:按 ...

  9. POJ 1408:Fishnet

    Fishnet Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1921   Accepted: 1234 Descripti ...

  10. 开源Git代码托管平台

    开源Git代码托管平台主要参考有以下4个: 1.GitHub 很多开源项目都来自GitHub,但是GitHub只能新建公开的Git仓库,私有 仓库要收费.GitHub地址:https://github ...