确信是正解的做法。
#include<bits/stdc++.h>
using namespace std;
const int N=250005;
int inline read()
{
int num=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){num=(num<<3)+(num<<1)+(ch^48);ch=getchar();}
return num*f;
}
int n,m,st,cnt,pos[15];
struct data{int v,id;}d[N];
#define ls (k<<1)
#define rs (k<<1|1)
#define mid (l+r>>1)
int t[N<<2];
void build(int k,int l,int r)
{
if(l==r)return t[k]=d[l].v,void();
build(ls,l,mid);
build(rs,mid+1,r);
t[k]=max(t[ls],t[rs]);
}
void upd(int k,int l,int r,int q,int v)
{
if(l==r)return t[k]=v,void();
if(q<=mid)upd(ls,l,mid,q,v);
else upd(rs,mid+1,r,q,v);
t[k]=max(t[ls],t[rs]);
}
int ask(int k,int l,int r,int ql,int qr)
{
if(ql<=l&&r<=qr)return t[k];
int res=0;
if(ql<=mid)res=max(res,ask(ls,l,mid,ql,qr));
if(qr>mid)res=max(res,ask(rs,mid+1,r,ql,qr));
return res;
}
#undef mid
int main(){
n=read();st=read();cnt=min(10,n);
for(int i=1;i<=n;i++)d[i]=(data){read(),i};
d[0].v=d[n+1].v=1e9;
build(1,0,n+1);
sort(d+1,d+1+n,[](data A,data B){return A.v>B.v;});
for(int i=1;i<=cnt;i++)pos[i]=d[i].id;
sort(d+1,d+1+n,[](data A,data B){return A.id<B.id;});
m=read();
while(m--)
{
char op[3];
scanf("%s",op);
if(op[0]=='E')
{
int id=read(),rnk=read();
for(int i=cnt;i>=rnk;i--)pos[i+1]=pos[i];
d[id].v=d[pos[rnk]].v;pos[rnk]=id;
for(int i=1;i<=rnk;i++)upd(1,0,n+1,pos[i],++d[pos[i]].v);
}
else
{
int ed=read(),mx,l,r;
if(st==ed){printf("0\n");continue;}
if(st<ed)
{
mx=ask(1,0,n+1,st+1,ed);
l=0,r=st-1;
while(l<r)
{
int mid=l+r+1>>1;
if(ask(1,0,n+1,mid,st-1)>mx)l=mid;
else r=mid-1;
}
printf("%d\n",ed-l-1);
}
else
{
mx=ask(1,0,n+1,ed,st-1);
l=st+1;r=n+1;
while(l<r)
{
int mid=l+r>>1;
if(ask(1,0,n+1,st+1,mid)>mx)r=mid;
else l=mid+1;
}
printf("%d\n",r-ed-1);
}
}
}
return 0;
}