3次提交均RE,本机无问题,洛谷在线IDE亦无问题。
附不开O2、10倍空间版本代码:
#include<bits/stdc++.h>
using namespace std;
#define rg register
#define In inline
#define ll long long
const int N = 8e4;
namespace IO{
In ll read(){
ll s = 0,ww = 1;
char ch = getchar();
while(ch < '0' || ch > '9'){if(ch == '-')ww = -1;ch = getchar();}
while('0' <= ch && ch <= '9'){s = 10 * s + ch - '0';ch = getchar();}
return s * ww;
}
In void write(ll x){
if(x < 0)putchar('-'),x = -x;
if(x > 9)write(x / 10);
putchar('0' + x % 10);
}
}
using namespace IO;
int n,m;
int p[N+5];
struct FHQTreap{
int cnt,rt;
int lc[20*N+5],rc[20*N+5],fa[20*N+5],sz[20*N+5],pri[20*N+5];
void print(int u){
cout<<"u="<<u<<" lc[u]="<<lc[u]<<" rc[u]="<<rc[u]<<" fa[u]="<<fa[u]<<" sz[u]="<<sz[u]<<endl;
if(lc[u])print(lc[u]);
if(rc[u])print(rc[u]);
}
In int pushup(int u){
sz[u] = sz[lc[u]] + sz[rc[u]] + 1;
}
int merge(int u,int v,int f){
if(!u || !v){if(u + v)fa[u+v] = f;return u + v;}
if(pri[u] > pri[v]){
rc[u] = merge(rc[u],v,u);
pushup(u);
fa[u] = f;
return u;
}
else{
lc[v] = merge(u,lc[v],v);
pushup(v);
fa[v] = f;
return v;
}
}
void split(int u,int &v,int &w,int x,int fv,int fw){
if(!u){v = w = 0;return;}
else{
if(sz[lc[u]] >= x){
w = u;
split(lc[u],v,lc[w],x,fv,w);
fa[w] = fw;
pushup(w);
}
else{
v = u;
split(rc[u],rc[v],w,x - sz[lc[u]] - 1,v,fw);
fa[v] = fv;
pushup(v);
}
}
}
void init(){
rt = 0;
cnt = n;
for(rg int i = 1;i <= n;i++)pri[i] = 1ll * rand() * 19709 % (ll)1e9,sz[i] = 1;
for(rg int i = 1;i <= n;i++)rt = merge(rt,p[i],0);
}
int kth(int u,int k){
if(sz[lc[u]] >= k)return kth(lc[u],k);
else if(sz[lc[u]] + 1 < k)return kth(rc[u],k - sz[lc[u]] - 1);
else return u;
}
stack<int>S;
int rank(int u){
int ans = sz[lc[u]] + 1;
int v = fa[u];
while(v != 0){
if(u == rc[v])ans += sz[lc[v]] + 1;
u = v,v = fa[v];
}
return ans;
}
In void Top(int x){
int k = rank(x);
//cout<<"x="<<x<<" k="<<k<<endl;
int u,v,w;
split(rt,u,v,k,0,0);
split(u,u,w,k - 1,0,0);
rt = merge(merge(w,u,0),v,0);
}
In void Bottom(int x){
int k = rank(x);
int u,v,w;
split(rt,u,v,k,0,0);
split(u,u,w,k - 1,0,0);
rt = merge(merge(u,v,0),w,0);
}
In void Insert(int x,int t){
if(t == 0)return;
int k = rank(x);
int u,v,w,y;
split(rt,u,v,k,0,0);
split(u,u,w,k - 1,0,0);
if(t == -1){
split(u,u,y,k - 2,0,0);
rt = merge(merge(u,w,0),merge(y,v,0),0);
}
else{
split(v,y,v,1,0,0);
rt = merge(merge(u,y,0),merge(w,v,0),0);
}
}
}T;
int main(){
// freopen("p2596.in","r",stdin);
// freopen("p2596.out","w",stdout);
// srand((int)time(0));
n = read(),m = read();
for(rg int i = 1;i <= n;i++)p[i] = read();
T.init();
//T.print(T.rt);
//cout<<T.lc[0]<<" "<<T.rc[0]<<" "<<T.fa[0]<<" "<<T.sz[0]<<" "<<T.pri[0]<<endl;
for(rg int i = 1;i <= m;i++){
//cout<<"i="<<i<<endl;
char ch = getchar();
while(ch != 'T' && ch != 'B' && ch != 'I' && ch != 'A' && ch != 'Q')ch = getchar();
char chh = getchar();
while(chh != ' ')chh = getchar();
if(ch == 'T'){
int s = read();
T.Top(s);
}
else if(ch == 'B'){
int s = read();
T.Bottom(s);
}
else if(ch == 'I'){
int s = read(),t = read();
T.Insert(s,t);
}
else if(ch == 'A'){
int s = read();
write(T.rank(s) - 1),putchar('\n');
}
else{
int k = read();
write(T.kth(T.rt,k)),putchar('\n');
}
//T.print(T.rt);
//cout<<T.lc[0]<<" "<<T.rc[0]<<" "<<T.fa[0]<<" "<<T.sz[0]<<" "<<T.pri[0]<<endl;
}
return 0;
}