RT,很奇怪地T了,但是可以提前知道的是一定是个非常zz的错误
码风有点压,见谅
code:
#include<iostream>
#include<algorithm>
#include<string>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#define int long long
#define inf 0x7fffffff
#define eps 1e-9
#define PII pair<int,int>
#define fx first
#define fy second
#define mk_p make_pair
#define Set(a,b) memset(a,b,sizeof(a))
#define file(x) freopen(x".in","r",stdin),freopen(x".out","w",stdout)
using namespace std;
const int maxn=1e6+5;
int n,q,a[maxn],d[maxn],k[maxn],L[1005],R[1005],tag[1005]; //a:原数组 d:排序数组 k:belong
char opt;
inline int read(){
int ans=0,flag=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')flag=-1;ch=getchar();}
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans*flag;
}
inline string reads(){
string ss;char ch=getchar();
while(ch=='\n'||ch=='\r'||ch==' ')ch=getchar();
while(ch!='\n'&&ch!='\r'&&ch!=' '){ss+=ch;ch=getchar();}
return ss;
}
void build(){
int siz=sqrt(n),tot=n/siz;
if(n%siz) tot++;
for(int i=1;i<=n;i++) k[i]=(i-1)/siz+1,d[i]=a[i];
for(int i=1;i<=tot;i++) L[i]=(i-1)*siz+1,R[i]=i*siz;
R[tot]=n;
for(int i=1;i<=n;i++) sort(d+L[i],d+R[i]+1);
}
void modify(int l,int r,int val){
if(k[l]==k[r]){
for(int i=l;i<=r;i++) a[i]+=val;
for(int i=L[k[l]];i<=R[k[l]];i++) d[i]=a[i];
sort(d+L[k[l]],d+R[k[l]]+1);
return;
}
for(int i=l;i<=R[k[l]];i++) a[i]+=val;
for(int i=L[k[l]];i<=R[k[l]];i++) d[i]=a[i];
sort(d+L[k[l]],d+R[k[l]]+1);
for(int i=k[l]+1;i<k[r];i++) tag[i]+=val;
for(int i=L[k[r]];i<=r;i++) a[i]+=val;
for(int i=L[k[r]];i<=R[k[r]];i++) d[i]=a[i];
sort(d+L[k[r]],d+R[k[r]]+1);
}
int query(int l,int r,int val){
int ans=0;
if(k[l]==k[r]){
for(int i=l;i<=r;i++)
if(a[i]+tag[k[l]]>=val) ans++;
return ans;
}
for(int i=l;i<=R[k[l]];i++)
if(a[i]+tag[k[l]]>=val) ans++;
for(int i=k[l]+1;i<k[r];i++){
int tl=L[i],tr=R[i],res=0;
while(tl<=tr){
int mid=(tl+tr)>>1;
if(d[mid]+tag[i]>=val) tr=mid-1,res=R[i]-mid+1;
else tl=mid+1;
}
ans+=res;
}
for(int i=L[k[r]];i<=r;i++)
if(a[i]+tag[k[r]]>=val) ans++;
return ans;
}
signed main(){
n=read(),q=read();
for(int i=1;i<=n;i++) a[i]=read();
build();
while(q--){
cin>>opt;
int l=read(),r=read(),c=read();
if(opt=='M') modify(l,r,c);
else printf("%lld\n",query(l,r,c));
}
return 0;
}