洛谷 P3369 【模板】普通平衡树
Treap模板:
#include<bits/stdc++.h>
using namespace std;
int n,type,cnt,ans,orz,root;
struct T
{
int left,right,key,weight,son,equ;
}node[100010];
void update(int t)
{
node[t].son=node[node[t].left].son+node[node[t].right].son+node[t].equ;
return;
}
void roleft(int &t)
{
int k=node[t].right;
node[t].right=node[k].left;
node[k].left=t;
node[k].son=node[t].son;
update(t);
t=k;
return;
}
void roright(int &t)
{
int k=node[t].left;
node[t].left=node[k].right;
node[k].right=t;
node[k].son=node[t].son;
update(t);
t=k;
return;
}
void insert(int &t,int v)
{
if(!t)
{
t=++cnt;
node[t].key=v;
node[t].weight=rand()%100000000;
node[t].son=1;
node[t].equ=1;
return;
}
node[t].son++;
if(v==node[t].key) node[t].equ++;
else
{
if(v<node[t].key)
{
insert(node[t].left,v);
if(node[node[t].left].weight<node[t].weight) roright(t);
}
else
{
insert(node[t].right,v);
if(node[node[t].right].weight<node[t].weight) roleft(t);
}
}
return;
}
void erase(int &t,int v)
{
if(t==0) return;
if(node[t].key==v)
{
if(node[t].equ>1)
{
node[t].equ--;
node[t].son--;
return;
}
if(!node[t].left) t=node[t].right;
else
{
if(!node[t].right) t=node[t].left;
else
{
if(node[node[t].left].weight<node[node[t].right].weight)
{
roright(t);
erase(t,v);
}
else
{
roleft(t);
erase(t,v);
}
}
}
}
else
{
if(v<node[t].key)
{
node[t].son--;
erase(node[t].left,v);
}
else
{
node[t].son--;
erase(node[t].right,v);
}
}
return;
}
int quary_rank(int t,int v)
{
if(t==0) return 0;
if(v==node[t].key) return node[node[t].left].son+1;
else
{
if(v<node[t].key)
{
return quary_rank(node[t].left,v);
}
else
{
return node[node[t].left].son+node[t].equ+quary_rank(node[t].right,v);
}
}
}
int quary_num(int t,int v)
{
if(t==0) return 0;
if(v<=node[node[t].left].son) return quary_num(node[t].left,v);
else
{
if(v>node[node[t].left].son+node[t].equ) return quary_num(node[t].right,v-node[node[t].left].son-node[t].equ);
else return node[t].key;
}
}
void quary_pre(int t,int v)
{
if(t==0) return;
if(v>node[t].key)
{
ans=t;
quary_pre(node[t].right,v);
}
else
{
quary_pre(node[t].left,v);
}
return;
}
void quary_sub(int t,int v)
{
if(t==0) return;
if(v<node[t].key)
{
ans=t;
quary_sub(node[t].left,v);
}
else
{
quary_sub(node[t].right,v);
}
return;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&type,&orz);
if(type==1) insert(root,orz);
if(type==2) erase(root,orz);
if(type==3) printf("%d\n",quary_rank(root,orz));
if(type==4) printf("%d\n",quary_num(root,orz));
if(type==5) quary_pre(root,orz),printf("%d\n",node[ans].key);
if(type==6) quary_sub(root,orz),printf("%d\n",node[ans].key);
}
return 0;
}