CyberPrisoner @ 2023-02-05 13:33:31
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,q,tot;
int id[N],len;
int a[N],b[N],c[N],L[N],R[N];
void add(int l,int r,int x){
int sid=id[l],eid=id[r];
if(sid==eid){
for(int i=l;i<=r;i++){
a[i]+=x;
}
for(int i=L[sid];i<=R[sid];i++){
c[i]=a[i];
}
sort(c+L[sid],c+R[sid]+1);
return;
}
for(int i=l;id[i]==sid;i++)
a[i]+=x;
for(int i=L[sid];i<=R[sid];i++)
c[i]=a[i];
sort(c+L[sid],c+R[sid]+1);
for(int i=r;id[i]==eid;i--)
a[i]+=x;
for(int i=L[eid];i<=R[eid];i++)
c[i]=a[i];
sort(c+L[eid],c+R[eid]+1);
for(int i=sid+1;i<eid;i++){
b[i]+=x;
}
}
int query(int l,int r,int x){
int ans=0;
int sid=id[l],eid=id[r];
if(sid==eid){
for(int i=l;i<=r;i++){
if(a[i]+b[sid]>=x)ans++;
}
return ans;
}
for(int i=l;i<=R[sid];i++){
if(a[i]+b[sid]>=x)ans++;
}
for(int i=r;i>=L[eid];i--){
if(a[i]+b[eid]>=x)ans++;
}
for(int i=sid+1;i<eid;i++){
if(c[L[i]]+b[i]>=x){
ans+=len;
continue;
}
int res=lower_bound(c+L[i],c+R[i]+1,x-b[i])-c-L[i];
//cout<<res<<endl;
ans+=R[i]-L[i]+1-res;
}
return ans;
}
int main(){
cin>>n>>q;
tot=len=sqrt(n);
if(len*len!=n)tot++;
for(int i=1;i<=n;i++){
cin>>a[i];
c[i]=a[i];
id[i]=(i-1)/len+1;
if(id[i]!=id[i-1])
L[id[i]]=i;
if(i/len+1!=id[i]){
R[id[i]]=i;
}
}
R[tot]=n;
for(int i=1;i<=tot;i++)
sort(c+L[i],c+R[i]+1);
for(int i=1;i<=q;i++){
char op;
int l,r,w;
cin>>op;
cin>>l>>r>>w;
if(op=='M'){
add(l,r,w);
}
if(op=='A'){
cout<<query(l,r,w)<<endl;
}
}
return 0;
}
by CyberPrisoner @ 2023-10-30 18:40:50
已重构代码,此贴结