rt,不知道是代码的问题还是常数的问题
#include<bits/stdc++.h>
using namespace std;
struct node{
int val,rd;
}p[100005];
int n,m,x,y,cnt=0,rx,ry,rz,ra,rb,root,gg;
int size[100005],son[100005][2],la[100005];
char op;
inline int read(){
int X=0; bool flag=1; char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
if(flag) return X;
return ~(X-1);
}inline void write(int X){
if(X<0) {X=~(X-1); putchar('-');}
if(X>9) write(X/10);
putchar(X%10+'0');
}
void push_up(int x){
size[x]=size[son[x][0]]+size[son[x][1]]+1;
}
void push_down(int x){
if(la[x]!=0){
p[son[x][0]].val+=la[x];
p[son[x][1]].val+=la[x];
la[son[x][0]]+=la[x];
la[son[x][1]]+=la[x];
la[x]=0;
}
}
int add(int x){
cnt++;
p[cnt].rd=rand();
p[cnt].val=x;
size[cnt]=1;
return cnt;
}
void split(int rt,int key,int &x,int &y){
if(!rt){
x=y=0;
return;
}
push_down(rt);
if(p[rt].val<=key){
x=rt;
split(son[rt][1],key,son[rt][1],y);
}else{
y=rt;
split(son[rt][0],key,x,son[rt][0]);
}
push_up(rt);
}
void split1(int rt,int siz,int &x,int &y){
if(!rt){
x=y=0;
return;
}
push_down(rt);
if(size[son[rt][0]]+1<=siz){
x=rt;
split1(son[rt][1],siz-(size[son[rt][0]]+1),son[rt][1],y);
}else{
y=rt;
split1(son[rt][0],siz,x,son[rt][0]);
}
push_up(rt);
}
int merge(int l,int r){
if(!l||!r){
return l+r;
}
push_down(l),push_down(r);
if(p[l].rd<p[r].rd){
son[l][1]=merge(son[l][1],r);
push_up(l);
return l;
}else{
son[r][0]=merge(l,son[r][0]);
push_up(r);
return r;
}
}
int getrnk(int x,int k){
while(true){
push_down(x);
if((size[son[x][0]]+1)==k){
return x;
}else if((size[son[x][0]]+1)<k){
k-=(size[son[x][0]]+1);
x=son[x][1];
}else x=son[x][0];
}
}
int main(){
n=read(),m=read();
for(int i=1;i<=n;i++){
x=read();
split(root,x,rx,ry);
root=merge(merge(rx,add(x)),ry);
}
while(m--){
op=getchar();
x=read(),y=read();
if(op=='F'){
split(root,y-1,rx,ry);
split1(ry,min(x,size[ry]),ry,rz);
la[ry]++;
p[ry].val++;
gg=p[getrnk(ry,size[ry])].val;
split(ry,gg-1,ry,ra);
split(rz,gg,rz,rb);
root=merge(merge(merge(merge(rx,ry),rz),ra),rb);
}else{
split(root,x-1,rx,ry);
split(ry,y,ry,rz);
write(size[ry]);
putchar('\n');
root=merge(merge(rx,ry),rz);
}
}
return 0;
}