zyc1219 @ 2024-12-15 20:23:02
#include<bits/stdc++.h>
using namespace std;
int a[1000005],b[1000005],pos[1000005],add[1005];
int st[1005],ed[1005];
void change(int L,int R,int w){
int p=pos[L],q=pos[R];
if(p==q){
for(int i=L;i<=R;i++) b[i]+=w;
for(int i=st[p];i<=ed[p];i++) a[i]=b[i];
sort(a+st[p],a+ed[p]+1);
}else{
for(int i=p+1;i<=q-1;i++) add[i]+=w;
for(int i=L;i<=ed[p];i++) b[i]+=w;
for(int i=st[p];i<=ed[p];i++) a[i]=b[i];
sort(a+st[p],a+ed[p]+1);
for(int i=st[q];i<=R;i++) b[i]+=w;
for(int i=st[q];i<=ed[q];i++) a[i]=b[i];
sort(a+st[q],a+ed[q]+1);
}
}
void ask(int L,int R,int w){
int p=pos[L],q=pos[R],ans=0;
if(p==q){
for(int i=L;i<=R;i++)
if(b[i]+add[i]>=w)
ans++;
}else{
for(int i=p+1;i<=q-1;i++){
int k=lower_bound(a+st[i],a+ed[i],w-add[i])-a;
if(k<=ed[i]){
k=ed[i]-k+1;
ans+=k;
}
}
for(int i=L;i<=ed[p];i++)
if(b[i]+add[i]>=w)ans++;
for(int i=st[q];i<=R;i++)
if(b[i]+add[i]>=w)ans++;
}
cout<<ans<<'\n';
}
int main(){
int n,q;
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
b[i]=a[i];
}
int block=sqrt(n),t=n/block;
if(n%block)t++;
for(int i=1;i<=t;i++){
st[i]=(i-1)*block+1;
ed[i]=block*i;
}
ed[t]=n;
for(int i=1;i<=n;i++)pos[i]=(i-1)/block+1;
for(int i=1;i<=t;i++)sort(a+st[i],a+ed[i]+1);
while(q--){
char ch;
cin>>ch;
int l,r,w;
scanf("%d%d%d",&l,&r,&w);
if(ch=='M')change(l,r,w);
else ask(l,r,w);
}
return 0;
}