建立一个splay维护书架的信息,开一个数组标记每一个编号对应的节点的指针就好了,没什么好说的
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n,m;
struct Tree{
int x,size;
Tree* ch[2],*f;
Tree(int a=0,Tree* e=NULL){
x=a,size=1,ch[0]=NULL,ch[1]=NULL,f=e;
}
void init(){
size=1;
if(ch[0]!=NULL)size+=ch[0]->size;
if(ch[1]!=NULL)size+=ch[1]->size;
}
};
Tree* rt=NULL,*bl[100020];
void Rotate(Tree* u){
Tree* f=u->f,*ff=f->f;
int d= !(u==f->ch[1]);
f->ch[!d]=u->ch[d];
if(u->ch[d]!=NULL)u->ch[d]->f=f;
u->f=ff;
if(ff!=NULL)ff->ch[f==ff->ch[1]]=u;
u->ch[d]=f;
f->f=u;
f->init();u->init();
}
void splay(Tree* u,Tree* x=NULL){
while(u->f!=x){
Tree* f=u->f,*ff=f->f;
if(ff==x){Rotate(u);break;}
int d=u==f->ch[1],dd=f==ff->ch[1];
if(d==dd)Rotate(f);
else Rotate(u);
Rotate(u);
}
if(x==NULL)rt=u;
}
//插入编号为x排行为k的书籍
void insert(Tree* u,int x,int k,Tree* fa,int d){
if(u==NULL){
u=new Tree(x,fa);if(fa!=NULL)fa->ch[d]=u;
bl[x]=u;splay(u);
return;
}
int size=1;
if(u->ch[0]!=NULL)size+=u->ch[0]->size;
if(k>size)insert(u->ch[1],x,k-size,u,1);
else insert(u->ch[0],x,k,u,0);
}
Tree* behind(Tree* u){while(u->ch[1]!=NULL)u=u->ch[1];return u;}
Tree* front(Tree* u){while(u->ch[0]!=NULL)u=u->ch[0];return u;}
void remove(Tree* u){
splay(u,NULL);
if(u->ch[0]==NULL&&u->ch[1]==NULL){rt=NULL;}
else if(u->ch[0]==NULL){
rt=u->ch[1];rt->f=NULL;
}else if(u->ch[1]==NULL){
rt=u->ch[0];rt->f=NULL;
}else{
Tree* x=behind(u->ch[0]);
splay(x,u);
x->f=NULL;rt=x;
x->ch[1]=u->ch[1];u->ch[1]->f=x;
x->init();
}
}
int query(Tree* u,int k){
int size=1;if(u->ch[0]!=NULL)size+=u->ch[0]->size;
if(k==size)return u->x;
if(k>size)return query(u->ch[1],k-size);
else return query(u->ch[0],k);
}
int main(){
scanf("%d%d",&n,&m);
for(int x,i=1;i<=n;i++){
scanf("%d",&x);
insert(rt,x,i,NULL,0);
}
char s[10];int x,size,T;
while(m--){
scanf("%s%d",s,&x);
if(s[0]=='T'){
remove(bl[x]);
insert(rt,x,1,NULL,0);
}else if(s[0]=='B'){
size=rt->size;
remove(bl[x]);
insert(rt,x,size,NULL,0);
}else if(s[0]=='I'){
scanf("%d",&T);
if(T==0)continue;
splay(bl[x],NULL);size=1;
if(rt->ch[0]!=NULL)size+=rt->ch[0]->size;
remove(bl[x]);
insert(rt,x,size+T,NULL,0);
}else if(s[0]=='A'){
splay(bl[x]);size=0;
if(rt->ch[0]!=NULL)size+=rt->ch[0]->size ;
printf("%d\n",size);
}else {
printf("%d\n",query(rt,x));
}
}
return 0;
}