但是我数组已经足够小了……不知为啥。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=100005;
int rt=0,sz=0;
int v[N],w[N],s[N],lc[N],rc[N];
void up(int u)
{
s[u]=s[lc[u]]+s[rc[u]]+1;
}
void split_w(int u,int w,int &x,int &y)
{
if(!u) {x=y=0;return;}
if(v[u]<=w) {x=u; split_w(rc[u],w,rc[u],y);}
else {y=u; split_w(lc[u],w,x,lc[u]);}
up(u);
}
void split_kth(int u,int k,int &x,int &y)
{
if(!u) {x=y=0;return;}
if(k<=s[lc[u]]){y=u; split_kth(lc[u],k,x,lc[u]);}
else{x=u; split_kth(rc[u],k-s[lc[u]]-1,rc[u],y);}
up(u);
}
int merge(int x,int y)
{
if(!x||!y) return x+y;
if(w[x]<w[y])
{
rc[x]=merge(rc[x],y);
up(x); return x;
}
else
{
lc[y]=merge(x,lc[y]);
up(y); return y;
}
}
int new_node(int val)
{
sz++;
v[sz]=val; w[sz]=rand(); s[sz]=1;
lc[sz]=rc[sz]=0;
return sz;
}
void insert(int& rt,int v)
{
int x,y;
split_w(rt,v,x,y);
rt=merge(merge(x,new_node(v)),y);
}
void del(int& rt,int v)
{
int x,y,z;
split_w(rt,v,x,y);
split_w(x,v-1,y,z);
y=merge(lc[y],rc[y]);
rt=merge(merge(x,y),z);
}
int rk(int& rt,int v)
{
int x,y,ans;
split_w(rt,v-1,x,y);
ans=s[x]+1;
rt=merge(x,y);
return ans;
}
int kth(int& rt,int k)
{
int x,y,z;
split_kth(rt,k,x,y);
for(z=x;rc[z];z=rc[z]);
rt=merge(x,y);
return z;
}
int pre(int& rt,int v)
{
int x,y,z;
split_w(rt,v,x,y);
for(z=x;rc[z];z=rc[z]);
rt=merge(x,y);
return z;
}
int suc(int& rt,int v)
{
int x,y,z;
split_w(rt,v,x,y);
for(z=y;lc[z];z=lc[z]);
rt=merge(x,y);
return z;
}
int main()
{
srand(time(0));
int n,ta,x;
scanf("%d",&n);
while(n--)
{
scanf("%d%d",&ta,&x);
switch(ta)
{
case 1: insert(rt,x); break;
case 2: del(rt,x); break;
case 3: printf("%d\n",rk(rt,x)); break;
case 4: printf("%d\n",v[kth(rt,x)]);break;
case 5: printf("%d\n",v[pre(rt,x)]);break;
case 6: printf("%d\n",v[suc(rt,x)]);break;
}
}
return 0;
}