Treap24分,估计是亿些奇奇怪怪的地方错了waw
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<queue>
//#include<map>
#include<vector>
#include<math.h>
using namespace std;
//#define int long long
#define forr(i,a,b) for(int i=a;i<=b;i++)
#define repp(i,a,b) for(int i=a;i>=b;i--)
#define INF 1e9
#define ll long long
#define MAXN 200005
const int _x[]={0,1,0,-1,0},_y[]={0,0,1,0,-1};
#define mem(a,n) memset(a,n,sizeof(a));
#define chkmax(a,b) a=a>b?a:b;
#define chkmin(a,b) a=a<b?a:b;
#include<set>
#include<stack>
#define INF 1e9
int sum,tot,root;
struct Treap_tree{
int l,r;
int dat,size;
int cnt,val;
}tree[MAXN*4];
#define lc tree[i].l
#define rc tree[i].r
void update(int i){
tree[i].size=tree[lc].size+tree[rc].size+tree[i].cnt;
}
int getrk(int i,int val){
if(i==0){
return 0;
}
if(val==tree[i].val){
return tree[lc].size+1;
}
if(val<tree[i].val){
return getrk(lc,val);
}
return getrk(rc,val)+tree[lc].size+tree[i].cnt;
}
int getval(int i,int val){
if(i==0){
return INF;
}
if(tree[lc].size>=val){
return getval(lc,val);
}
if(tree[lc].size+tree[i].cnt>=val){
return tree[i].val;
}
return getval(rc,val-tree[lc].size-tree[i].cnt);
}
void zig(int &i){
int l=lc;
lc=tree[l].r,tree[l].r=i;
i=l;
update(rc);
update(i);
}
void zag(int &i){
int r=rc;
rc=tree[r].l,tree[r].l=i;
i=r;
update(rc);
update(i);
}
void Insert(int &i,int val){
if(i==0){
i=++tot;
tree[i].dat=rand();
tree[i].size=tree[i].cnt=1;
tree[i].val=val;
return;
}
if(val==tree[i].val){
tree[i].cnt++;
update(i);
return;
}
if(val<tree[i].val){
Insert(lc,val);
if(tree[i].dat<tree[lc].dat){
zig(i);
}
}
else{
Insert(rc,val);
if(tree[i].dat<tree[rc].dat){
zag(i);
}
}
}
int gp(int i,int val){
if(!i){
return -INF;
}
if(val<=tree[i].val){
gp(lc,val);
}
else{
return max(gp(rc,val),tree[i].val);
}
}
int gn(int i,int val){
if(!i){
return INF;
}
if(val>=tree[i].val){
gn(rc,val);
}
else{
return min(tree[i].val,gn(lc,val));
}
}
void pop(int &i,int val){
if(i==0){
return;
}
if(val==tree[i].val){
if(tree[i].cnt>1){
tree[i].cnt--;
update(i);
return;
}
if(lc||rc){
if(rc==0||tree[lc].dat>tree[rc].dat){
zig(i);
pop(rc,val);
}
else{
zag(i);
pop(lc,val);
}
update(i);
}
else{
i=0;
}
return;
}
if(val<tree[i].val){
pop(lc,val);
}
else{
pop(rc,val);
}
update(i);
}
int main(){
int T;
scanf("%d",&T);
while(T--){
int opt,x;
scanf("%d%d",&opt,&x);
switch(opt){
case 1:{
Insert(root,x);
break;
}
case 2:{
pop(root,x);
break;
}
case 3:{
printf("%d\n",getrk(root,x));
break;
}
case 4:{
printf("%d\n",getval(root,x));
break;
}
case 5:{
printf("%d\n",gp(root,x));
break;
}
case 6:{
printf("%d\n",gn(root,x));
break;
}
}
}
}