RT 代码:
#include<iostream>
#include<cstdlib>
#include<string>
using namespace std;
int mn,mx;
struct tree
{
int tot,rt;
struct Node
{
int l,r;
int rnd;
int val;
int siz;
}tr[82005];
int build(int valu,int x)
{
tr[valu].val=x;
tr[valu].siz=1;
tr[valu].rnd=rand();
return valu;
}
int pushup(int x)
{
tr[x].siz=tr[tr[x].l].siz+tr[tr[x].r].siz+1;
}
int find(int root, int rank)
{
while (root)
{
if (tr[tr[root].l].siz+1==rank) break;
if (tr[tr[root].l].siz>=rank) root=tr[root].l;
else
{
rank-=tr[tr[root].l].siz+1;
root=tr[root].r;
}
}
return root;
}
int find(int rank)
{
return find(rt,rank);
}
void split(int x,int k,int &l,int &r)
{
if(!x) {l=r=0;return;}
if(tr[x].val<=k)
{
l=x;
split(tr[x].r,k,tr[x].r,r);
pushup(x);
}
else
{
r=x;
split(tr[x].l,k,l,tr[x].l);
pushup(x);
}
}
int merge(int l,int r)
{
if(!l||!r)
return l|r;
if(tr[l].rnd<tr[r].rnd)
{
tr[l].r=merge(tr[l].r,r);
pushup(l);
return l;
}
else
{
tr[r].l=merge(l,tr[r].l);
pushup(r);
return r;
}
}
void insert(int val,int p)
{
int x,y;
split(rt,p,x,y);
rt=merge(merge(x,build(val,p)),y);
}
void update(int val,int op)
{
int x,y,z;
split(rt,tr[val].val,x,z);
split(x,tr[val].val-1,x,y);
if(op)
{
tr[val].val=--mn;
rt=merge(merge(y,x),z);
}
else
{
tr[val].val=++mx;
rt=merge(merge(x,z),y);
}
}
void reverse(int val,int op)
{
if(!op) return;
if(op==1)
{
int x,y,z,w;
split(rt,tr[val].val,x,z);
split(x,tr[val].val-1,x,y);
int t=find(z,1);
split(z,tr[t].val,z,w);
swap(tr[y].val,tr[z].val);
rt=merge(merge(x,z),merge(y,w));
}
else
{
int x,y,z,w;
split(rt,tr[val].val-1,x,z);
split(z,tr[val].val,z,w);
int t=find(x,tr[x].siz);
split(x,tr[t].val-1,x,y);
swap(tr[y].val,tr[z].val);
rt=merge(merge(x,z),merge(y,w));
}
}
int rank(int val)
{
int x,y,ans;
split(rt,tr[val].val-1,x,y);
ans=tr[x].siz;
rt=merge(x,y);
return ans;
}
}tree;
int n,m;
string a;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
tree.insert(x,i);
}
mn=1,mx=n;
for(int i=1;i<=m;i++)
{
int x,t;
cin>>a>>x;
if(a[0]=='T')
tree.update(x,1);
else if(a[0]=='B')
tree.update(x,0);
else if(a[0]=='I')
cin>>t,tree.reverse(x,t);
else if(a[0]=='A')
cout<<tree.rank(x)<<endl;
else
cout<<tree.find(x)<<endl;
}
return 0;
}