B_1168 @ 2018-04-16 20:38:53
6T3W1AC,求助大佬…………qwq
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000010,maxs=1001;
int a[maxn],kr[maxn],be[maxn],l[maxs],r[maxs],tag[maxs],p,n,len,num=0;
inline void res(int L,int R){
for(int i=L;i<=R;i++)kr[i]=a[i];
sort(kr+l[be[L]],kr+r[be[R]]+1);
}
inline void query(int L,int R,int q){
int ans=0;
if(be[L]==be[R]){
for(int i=L;i<=R;i++){
if(a[i]+tag[be[L]]>=q)ans++;
}
printf("%d\n",ans);
}
else{
for(int i=L;i<=r[be[L]];i++){
if(a[i]+tag[be[L]]>=q)ans++;
}
for(int i=l[be[R]];i<=R;i++){
if(a[i]+tag[be[R]]>=q)ans++;
}
for(int i=be[L]+1;i<=be[R]-1;i++){
ans+=r[i]-(lower_bound(kr+l[i],kr+r[i]+1,q-tag[i])-kr)+1;
}
printf("%d\n",ans);
}
}
inline void modify(int L,int R,int q){
if(be[L]==be[R]){//same section
for(int i=L;i<=R;i++)a[i]+=q;
res(L,R);
}
else{//cross_sectioned
for(int i=L;i<=r[be[L]];i++)a[i]+=q;
res(L,r[be[L]]);
for(int i=l[be[R]];i<=R;i++)a[i]+=q;
res(l[be[R]],R);//(at most 2)side parts
for(int i=be[L]+1;i<=be[R]-1;i++)tag[i]+=q;//whole sectioned
}
}
int main(){
scanf("%d%d",&n,&p);
int len=sqrt(n);
int num=n/len;
if (n%len) num++;
for(int i=1;i<=num;i++)l[i]=(i-1)*len+1,r[i]=i*len;
for(register int i=1;i<=n;i++)be[i]=(i-1)/len+1;
for(register int i=1;i<=n;i++){
scanf("%d",&a[i]);
kr[i]=a[i];
}
for(int i=1;i<=num;i++){
res(l[i],r[i]);
}
for(int i=1;i<=p;i++){
char tmp;
int x=0,y=0,z=0;
scanf("%c%d%d%d\n",&tmp,&x,&y,&z);
if(tmp=='A'){
query(x,y,z);
}
if(tmp=='M'){
modify(x,y,z);
}
}
}