rt,下了#1的数据,能过,但在洛谷全T了 code:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inl inline
#define endl '\n'
#define gc cin.get
#define pc cout.put
const int N=1e6+5;
const int M=2e8+5;
const int inf=0x3f3f3f3f;
const int mod=997;
const int base=13131;
inl int read(){
int x=0,f=1;char c=gc();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc();}
while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return x*f;
}
int n,m,a[N],rt;
struct balanced_tree{
int siz[N],ls[N],rs[N],rd[N],fa[N];
inl void pushup(int k){siz[k]=siz[ls[k]]+1+siz[rs[k]];}
inl void build(int &k,int l,int r){
if(l>r)return;
int mid=l+r>>1;k=a[mid];siz[k]=1;rd[k]=rand();
if(l==r)return;
build(ls[k],l,mid-1);
build(rs[k],mid+1,r);
if(ls[k])fa[ls[k]]=k;
if(rs[k])fa[rs[k]]=k;
pushup(k);
}
inl void split(int k,int x,int &l,int &r){
if(!k)return l=r=0,void();
if(siz[ls[k]]+1<=x){
l=k;
split(rs[k],x-siz[ls[k]]-1,rs[k],r);
if(rs[k])fa[rs[k]]=k;
}else{
r=k;
split(ls[k],x,l,ls[k]);
if(ls[k])fa[ls[k]]=k;
}
pushup(k);
}
inl int merge(int x,int y){
if(!x||!y)return x+y;
if(rd[x]<rd[y]){
rs[x]=merge(rs[x],y);
if(rs[x])fa[rs[x]]=x;
return pushup(x),x;
}else{
ls[y]=merge(x,ls[y]);
if(ls[y])fa[ls[y]]=y;
pushup(y);
return pushup(y),y;
}
return -1;
}
inl int find(int x){
int ans=siz[ls[x]];
while(x){
if(rs[fa[x]]==x)ans+=siz[ls[fa[x]]]+1;
x=fa[x];
}
return ans+1;
}
}fhq;
signed main(){
// freopen("1.in","r",stdin);
// freopen("1.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
n=read();m=read();
for(int i=1;i<=n;i++)a[i]=read();
fhq.build(rt,1,n);
while(m--){
string s;cin>>s;
if(s[0]=='T'){
int l,r,q,rk=fhq.find(read());
fhq.split(rt,rk,l,r);
fhq.split(l,rk-1,l,q);
rt=fhq.merge(q,fhq.merge(l,r));
}
if(s[0]=='B'){
int l,r,q,rk=fhq.find(read());
fhq.split(rt,rk,l,r);
fhq.split(l,rk-1,l,q);
rt=fhq.merge(fhq.merge(l,r),q);
}
if(s[0]=='I'){
int l,r,p,q,x=fhq.find(read()),y=x+read();
if(x>y)swap(x,y);
fhq.split(rt,y,l,r);
fhq.split(l,y-1,l,q);
fhq.split(l,x-1,l,p);
rt=fhq.merge(fhq.merge(l,q),fhq.merge(p,r));
}
if(s[0]=='A')
cout<<fhq.find(read())-1<<endl;
if(s[0]=='Q'){
int rk=read(),l,q,r;
fhq.split(rt,rk,l,r);
fhq.split(l,rk-1,l,q);
cout<<q<<endl;
rt=fhq.merge(fhq.merge(l,q),r);
}
}
return 0;
}
#1 input:
5 9
2 1 5 3 4
Top 3
Insert 2 0
Ask 4
Bottom 2
Insert 5 -1
Bottom 2
Query 3
Ask 4
Ask 5
#1 output:
4
1
3
1