RT,有 RE 无 WA 无 TLE,数据是按照1e6开的。
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<queue>
using namespace std;
#define rei register int
#define il inline
il const void readln(int &I){
I=0;char C=getchar();bool f=0;
while(!isdigit(C))f|=(C=='-'),C=getchar();
while( isdigit(C))I=I*10+C-'0',C=getchar();
if(f)I=-I;
}
const int maxn=1100205;
const int siz=1048;
const int inf=0x7fffffff;
int p[siz+10];//p i refers to the position of the (i*siz)-th book
int endi,size,ans;
struct node{int val,pre,suf;};
struct iter{int pos,rk;iter(){pos=rk=0;}iter(int POS,int RK){pos=POS,rk=RK;}};
struct li{
node data[maxn];
node& operator[](iter it){return data[it.pos];}
li(){data[0]={-inf,-inf,maxn-1},data[maxn-1]={inf,0,inf};}
}lis;
iter operator++(iter&it){it.pos=lis[it].suf,++it.rk;return it;}
iter operator--(iter&it){it.pos=lis[it].pre,--it.rk;return it;}
iter operator>>(iter it,int t){while(t--)++it;return it;}
iter operator>>=(iter &it,int t){return it=(it>>t);}
iter rk(int rnk){return iter{p[rnk/siz],rnk/siz*siz}>>(rnk%siz);}// the iter whith rk=rnk;
iter lb(int v){// lower bound (v=3) 1 1 2 2[2]3 3 3
int z=0;while(((z+1)*siz<size) and lis[{p[z+1],(z+1)*siz}].val<v)++z;
iter it={p[z],z*siz};while(lis[it>>1].val<v)++it;
//printf("lb(%d)= %d,%d\n",v,it.pos,it.rk);
return it;
}
queue<int>em;
iter toop(int rr){
if(em.empty())em.push(++endi);
iter ans={em.front(),rr};em.pop();
//printf("?%d %d\n",ans.pos,ans.rk);
return ans;
}
void ins(int val){
++size;
iter vpre=lb(val),vsuf=vpre>>1,vnew=toop(vpre.rk+1);
//printf("###%d %d %d\n",vpre.pos,vnew.pos,vsuf.pos);
lis[vnew]={val,vpre.pos,vsuf.pos},
lis[vpre]={lis[vpre].val,lis[vpre].pre,vnew.pos},
lis[vsuf]={lis[vsuf].val,vnew.pos,lis[vsuf].suf};
for(rei i=vnew.rk/siz+(bool)(vnew.rk%siz);p[i];i++)p[i]=lis[iter(p[i],i*siz)].pre;
if(size%siz==0)p[size/siz]=lis[iter(maxn-1,size+1)].pre;
}
void del(int val){
--size;
iter vpre=lb(val),vsuf=vpre>>2;em.push((vpre>>1).pos);
lis[vpre]={lis[vpre].val,lis[vpre].pre,vsuf.pos};
lis[vsuf]={lis[vsuf].val,vsuf.pos,lis[vsuf].suf};
for(rei i=(vpre>>1).rk/siz+(bool)((vpre>>1).rk%siz);p[i];i++)p[i]=lis[iter(p[i],i*siz)].suf;
}
int n,op,x;
void test(){
for(int i=0;i<=5;i++)printf("%4d",p[i]);puts("");
for(iter it;it.pos<maxn-1;++it){
printf("at:%d(%d){%d %d %d}\n",it.rk,it.pos,lis[it].val,lis[it].pre,lis[it].suf);
}
}
int main(){
//freopen("P3369_6.in","r",stdin);
//freopen("out.txt","w",stdout);
readln(n);
while(n--){
readln(op),readln(x);
switch(op){
case 1:ins(x);break;
case 2:del(x);break;
case 3:printf("%d\n",lb(x).rk+1);break;
case 4:printf("%d\n",lis[rk(x)].val);break;
case 5:printf("%d\n",lis[lb(x)].val);break;
case 6:printf("%d\n",lis[lb(x+1)>>1].val);break;
default:
//test();
break;
}
//if(ans==62145)
//printf("!!!%d %d\n",op,x);
}
}