P3369,7分
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
int n,rt,cnt;
struct Treap{
int lch,rch,val,pri,cnt,siz;
}tr[maxn<<3];
int add(int x){
tr[++cnt]={0,0,x,rand(),1,1};
return cnt;
}
void push_up(int u){
tr[u].siz=tr[tr[u].lch].siz+tr[tr[u].rch].siz+tr[u].cnt;
}
void zig(int &u){
int v=tr[u].lch;
tr[u].lch=tr[v].rch;
tr[v].rch=u;
tr[v].siz=tr[u].siz;
push_up(u);
u=v;
}
void zag(int &u){
int v=tr[u].rch;
tr[u].rch=tr[v].lch;
tr[v].lch=u;
tr[v].siz=tr[u].siz;
push_up(u);
u=v;
}
void insert(int &u,int k){
if(!u){
u=add(k);
return;
}
tr[u].siz++;
if(tr[u].val==k){
tr[u].cnt++;
return;
}
else{
if(k<tr[u].val){
insert(tr[u].lch,k);
if(tr[u].pri<tr[tr[u].lch].pri) zig(u);
}
else{
insert(tr[u].rch,k);
if(tr[u].pri<tr[tr[u].rch].pri) zag(u);
}
}
push_up(u);
}
void del(int &u,int k){
if(!u) return;
tr[u].siz--;
if(k==tr[u].val){
if(tr[u].cnt>1){
tr[u].cnt--;
return;
}
if(!tr[u].lch||!tr[u].rch) u=tr[u].lch+tr[u].rch;
else if(tr[tr[u].lch].pri>tr[tr[u].rch].pri){
zig(u);
del(tr[u].rch,k);
}
else{
zag(u);
del(tr[u].lch,k);
}
return;
}
if(k<tr[u].val) del(tr[u].lch,k);
else del(tr[u].rch,k);
push_up(u);
}
int pre(int u,int x){
if(!u) return -2e9;
if(x<=tr[u].val) return pre(tr[u].lch,x);
else return max(tr[u].val,pre(tr[u].rch,x));
}
int nxt(int u,int x){
if(!u) return 2e9;
if(x>=tr[u].val) return nxt(tr[u].rch,x);
else return min(tr[u].val,nxt(tr[u].lch,x));
}
int Val_to_Rank(int u,int k){
if(!u) return 0;
if(tr[u].val==k) return tr[tr[u].lch].siz+1;
if(k<tr[u].val) return Val_to_Rank(tr[u].lch,k);
else return Val_to_Rank(tr[u].rch,k);
}
int Rank_to_Val(int u,int k){
if(!u) return 0;
if(tr[tr[u].lch].siz>=k) return Rank_to_Val(tr[u].lch,k);
if(tr[tr[u].lch].siz+tr[u].cnt>=k) return tr[u].val;
return Rank_to_Val(tr[u].rch,k-tr[tr[u].lch].siz-tr[u].cnt);
}
int main(){
scanf("%d",&n);
for(int i=1,op,x;i<=n;i++){
scanf("%d %d",&op,&x);
if(op==1) insert(rt,x);
else if(op==2) del(rt,x);
else if(op==3) printf("%d\n",Val_to_Rank(rt,x)+1);
else if(op==4) printf("%d\n",Rank_to_Val(rt,x));
else if(op==5) printf("%d\n",pre(rt,x));
else if(op==6) printf("%d\n",nxt(rt,x));
}
return 0;
}//Zq_water
hack数据:
4
1 10
1 30
1 20
3 21