#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. 从PC厂商狠抓粉丝经济看,春天将至?

    10月中旬,市场研究机构IDC发布的全球三季度PC出货量报告显示,第三季度全球个人电脑出货量总计6740万台,比去年同期下降0.9%.似乎这一数据的发布,依旧在证明着PC市场的颓势.但在这样的大背景下 ...

  2. docker 后台运行和进入后台运行的容器

    先创建并进入一个新的被命名为newos的新容器    docker run -it --name newos docker.io/centos #创建并指定端口号映射 docker run -d -p ...

  3. redis报错MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist

    解决方法:通过redis-cli连接到服务器后执行以下命令: config set stop-writes-on-bgsave-error no 注意:这种方法只是忽略了问题,并没有解决问题,具体问题 ...

  4. C语言小游戏: 2048.c

    概要:2048.c是一个C语言编写的2048游戏,本文将详细分析它的源码和实现.C语言是一种经典实用的编程语言,本身也不复杂,但是学会C语言和能够编写实用的程序还是有一道鸿沟的.本文试图通过一个例子展 ...

  5. 09.swoole学习笔记--进程事件

    <?php //进程数组 $workers=[]; //创建进程的数据量 $worker_num=; //创建启动进程 ;$i<$worker_num;$i++){ //创建单独新进程 $ ...

  6. 十一、JavaScript之两种注释方法

    一.代码如下 二.运行效果如下

  7. web前端知识点

    一.CSS问题 1.flex布局 display:flex; 在父元素设置,子元素受弹性盒影响,默认排成一行,如果超出一行,按比例压缩 flex:1; 子元素设置,设置子元素如何分配父元素的空间,fl ...

  8. 球队“食物链”(DFS+剪枝)

    某国的足球联赛中有N支参赛球队,编号从1至N.联赛采用主客场双循环赛制,参赛球队两两之间在双方主场各赛一场. 联赛战罢,结果已经尘埃落定.此时,联赛主席突发奇想,希望从中找出一条包含所有球队的“食物链 ...

  9. C#获取图片的某个区域

            /// <summary>        /// http://www.cnblogs.com/KissKnife/archive/2007/10/13/923352.ht ...

  10. Linux-课后练习(第二章命令)20200217-2