初识treap
tree + heap = treap .......................
#include<cstdio>
#include<cstdlib>
struct SBT {
int x,r,sz,ch[2],t;
bool u;
}T[100010];
int n,st = 1,Bcnt;
void rot(int &now,int d) {
int s = T[now].ch[d^1];
int ns = T[now].ch[d];
int temp = T[now].sz;
T[now].sz = T[now].sz - T[s].sz + T[T[s].ch[d]].sz;
T[s].sz = temp;
T[now].ch[d^1] = T[s].ch[d];
T[s].ch[d] = now;
now = s;
}
void insert (int x,int &now) {
if(!T[now].u || (T[now].x == x && T[now].u)) {
if(!T[now].u) {
T[now].u = 1;
T[now].x = x;
T[now].r = rand();
}
++T[now].t;
++T[now].sz;
}
else {
if(T[now].x < x) {
if(T[now].ch[1] == 0)
T[now].ch[1] = Bcnt;
insert(x,T[now].ch[1]);
++T[now].sz;
if(T[now].r > T[T[now].ch[1]].r)
rot(now,0);
}
else {
if(T[now].ch[0] == 0)
T[now].ch[0] = Bcnt;
insert(x,T[now].ch[0]);
++T[now].sz;
if(T[now].r > T[T[now].ch[0]].r)
rot(now,1);
}
}
}
bool move(int &now) {
if(T[now].ch[1] * T[now].ch[0] == 0) {
if(T[now].ch[1] == 0)
now = T[now].ch[0];
else now = T[now].ch[1];
return 1;
}
return 0;
}
void sink (int &now) {
if(!move(now)) {
int d;
if( T[ T[now].ch[0] ].r < T[ T[now].ch[1] ].r)
d = 1;
else d = 0;
rot(now,d);
sink(T[now].ch[d]);
--T[now].sz;
}
}
void del(int x,int &now) {
if(T[now].x == x) {
if(T[now].t > 1) {
--T[now].t;
--T[now].sz;
}
else sink(now);
}
else {
if(T[now].x > x)
del(x,T[now].ch[0]);
else del(x,T[now].ch[1]);
--T[now].sz;
}
}
void search (int x,int now,int f) {
f += T[T[now].ch[0]].sz;
if(T[now].x == x)
printf("%d\n",f);
else {
if(T[now].x > x)
search(x,T[now].ch[0],f - T[T[now].ch[0]].sz);
else search(x,T[now].ch[1],f + T[now].t);
}
}
void rank(int x,int now,int f) {
f += T[T[now].ch[0]].sz;
if(x >= f && x <= f + T[now].t - 1)
printf("%d\n",T[now].x);
else {
if(x < f)
rank(x,T[now].ch[0],f - T[T[now].ch[0]].sz);
else rank(x,T[now].ch[1],f + T[now].t);
}
}
int max (int a,int b) {
if(a>b)
return a;
return b;
}
int min(int a,int b) {
if(b<a)
return b;
return a;
}
int qq (int x,int now) {
if(now == 0)
return -0x3f3f3f3f;
if(T[now].x >= x)
return qq(x,T[now].ch[0]);
else return max(T[now].x,qq(x,T[now].ch[1]));
}
int hj(int x,int now) {
if(now == 0)
return 0x3f3f3f3f;
if(T[now].x <= x)
return hj(x,T[now].ch[1]);
else return min(T[now].x,hj(x,T[now].ch[0]));
}
void solve () {
int op,x;
for(int i = 1 ;i <= n;++i) {
scanf("%d%d",&op,&x);
if(op == 1) {
++Bcnt;
insert(x,st);
}
else {
if(op == 2) {
del(x,st);
}
else {
if(op == 3) {
search(x,st,1);
}
else {
if(op == 4) {
rank(x,st,1);
}
else {
if(op == 5)
printf("%d\n",qq(x,st));
else printf("%d\n",hj(x,st));
}
}
}
}
}
}
int main () {
scanf("%d",&n);
solve();
}
1万+

被折叠的 条评论
为什么被折叠?



