用的是splay的写法,但是第二个测试点WA了(恼
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
struct node{
int s[2]; //s[0]代表左儿子
int parent,value,cnt,size;
void init(int p,int v){
parent=p,value=v;
cnt=size=1;
}
}splay[1000005];
int root,idx;
void pushup(int u){
splay[u].size=splay[splay[u].s[0]].size+splay[splay[u].s[1]].size+splay[u].cnt;
}
void rotate(int u){ //旋转
int y=splay[u].parent;
int z=splay[y].parent;
int k=splay[y].s[1]==u;
splay[y].s[k]=splay[u].s[k^1];
splay[splay[u].s[k^1]].parent=y;
splay[u].s[k^1]=y;
splay[y].parent=u;
splay[z].s[splay[z].s[1]==y]=u;
splay[u].parent=z;
pushup(y),pushup(u);
}
//伸展splay
void sp(int u,int k){
while(splay[u].parent!=k){ //当u为k的儿子时结束
int y=splay[u].parent;
int z=splay[y].parent;
if(z!=k){
if((splay[y].s[0]==u)^(splay[z].s[0]==y)){ //双旋判断是直线型还是折线型
rotate(u);
}
else rotate(y);
}
rotate(u);
}
if(k==0) root=u;
}
void find(int v){
int u=root;
while(splay[u].s[v>splay[u].value]&&v!=splay[u].value){
u=splay[u].s[v>splay[u].value];
}
sp(u,0);
}
int query_front(int v){
find(v);
int u=root;
if(splay[u].value<v) return u;
u=splay[u].s[0];
while(splay[u].s[1]){
u=splay[u].s[1];
}
sp(u,0);
return u;
}
int query_end(int v){
find(v);
int u=root;
if(splay[u].value>v) return u;
u=splay[u].s[1];
while(splay[u].s[0]){
u=splay[u].s[0];
}
sp(u,0);
return u;
}
void del(int v){
int pre=query_front(v);
int suc=query_end(v);
sp(pre,0);
sp(suc,pre);
int del=splay[suc].s[0];
if(splay[del].cnt>1){
splay[del].cnt--;
sp(del,0);
}
else{
splay[suc].s[0]=0;
sp(suc,0);
}
}
int rnk(int v){
find(v);
return splay[splay[root].s[0]].size;
}
int rnk_val(int k){
int u=root;
while(1){
int y=splay[u].s[0];
if(splay[y].size+splay[u].cnt<k){
k-=splay[y].size+splay[u].cnt;
u=splay[u].s[1];
}
else{
if(splay[y].size>=k){
u=splay[u].s[0];
}
else break;
}
}
sp(u,0);
return splay[u].value;
}
int insert(int v){
int u=root;
int p=0;
while(u&&splay[u].value!=v){
p=u;
u=splay[u].s[v>splay[u].value];
}
if(u){
splay[u].cnt++;
}
else{
u=++idx;
splay[p].s[v>splay[p].value]=u;
splay[u].init(p,v);
}
sp(u,0);
}
int main(){
insert(-1e9),insert(1e9);//哨兵
int n;
cin>>n;
while(n--){
int op,x;
cin>>op>>x;
if(op==1) insert(x);
else if(op==2) del(x);
else if(op==3) cout<<rnk(x)<<endl;
else if(op==4) cout<<rnk_val(x+1)<<endl;
else if(op==5) cout<<splay[query_front(x)].value<<endl;
else if(op==6) cout<<splay[query_end(x)].value<<endl;
}
return 0;
}