代码如下
#include<bits/stdc++.h>
using namespace std;
unsigned long long zzx=2020150;
int rdm(){
return (zzx*=23333)%2147483647;
}
const int M=1e5+10;
struct node{
int lc,rc,pri,val;
node(int l=0,int r=0,int p=0,int v=0):lc(l),rc(r),pri(p),val(v){}
}tr[M];
int root,cntp;
int newval(int val){
tr[++cntp]=node(0,0,rdm(),val);
return cntp;
}
void zig(int &p){
int q=tr[p].lc;
tr[p].lc=tr[q].rc;
tr[q].rc=p;
p=q;
}
void zag(int &p){
int q=tr[p].rc;
tr[p].rc=tr[q].lc;
tr[q].lc=p;
p=q;
}
void insert(int &p,int val){
if(!p){
p=newval(val);
return;
}
if(tr[p].val==val){
printf("Already Exist\n");
return;
}
if(val<tr[p].val){
insert(tr[p].lc,val);
if(tr[tr[p].lc].pri>tr[p].pri) zig(p);
}else{
insert(tr[p].rc,val);
if(tr[tr[p].rc].pri>tr[p].pri) zag(p);
}
}
void remove(int &p,int val){
if(!p) return;
if(tr[p].val==val){
if(!tr[p].lc||!tr[p].rc) p=tr[p].lc=tr[p].rc;
else if(tr[tr[p].lc].pri>tr[tr[p].rc].pri){
zig(p);
remove(tr[p].rc,val);
}else{
zag(p);
remove(tr[p].lc,val);
}
return;
}
if(tr[p].val>val) remove(tr[p].lc,val);
else remove(tr[p].rc,val);
}
int pre(int val){
int cur=root,res=0;
while(cur)
if(tr[cur].val<val){
res=tr[cur].val;
cur=tr[cur].rc;
}else cur=tr[cur].lc;
return res;
}
int suf(int val){
int cur=root,res=0;
while(cur)
if(tr[cur].val>val){
res=tr[cur].val;
cur=tr[cur].lc;
}else cur=tr[cur].rc;
return res;
}
bool count(int val){
int cur=root;
while(cur)
if(tr[cur].val==val) return true;
else if(tr[cur].val>val) cur=tr[cur].lc;
else cur=tr[cur].rc;
return false;
}
void print(int p){
if(tr[p].lc) print(tr[p].lc);
printf("%d ",tr[p].val);
if(tr[p].rc) print(tr[p].rc);
}
int n,s,p;
int main(){
scanf("%d",&n);
for(int i=1,opt,x;i<=n;i++){
scanf("%d%d",&opt,&x);
switch(opt){
case 1:insert(root,x);break;
case 2:
if(count(x)){
printf("%d\n",x);
remove(root,x);
break;
}
s=suf(x),p=pre(x);
if(p!=0&&(x-p>=s-x||s==0)) printf("%d\n",p),remove(root,p);
else if(s!=0) printf("%d\n",s),remove(root,s);
else printf("Empty\n");
default:break;
}
//print(root);putchar('\n');
}
return 0;
}
调吐了 求大佬帮忙