分块板子题,检查了半天也查不出来蚌埠住了
悬赏关注,谢谢大佬的帮助
#include<bits/stdc++.h>
#define ll long long
#define ld long double
using namespace std;
const int N=1e6+10;
int n,q;
ll lt[N],w[N],len,t[N];
int st[N],ed[N],id[N];
void Sort(int x){
for(int i=st[x];i<=ed[x];i++) t[i]=w[i];
sort(t+st[x],t+ed[x]+1);
}
void add(int l,int r,int x){
if(id[l]==id[r]){
for(int i=l;i<=r;i++) w[i]+=x;
Sort(id[l]);
return;
}
for(int i=l;i<=ed[id[l]];i++) w[i]+=x;
for(int i=id[l]+1;i<id[r];i++) lt[i]+=x;
for(int i=st[id[r]];i<=r;i++) w[i]+=x;
Sort(id[l]);Sort(id[r]);
}
int query(int l,int r,int x){
//************************判断>=的时候加上lazytag!!!**************************
int cnt=0;
if(id[l]==id[r]){
for(int i=l;i<=r;i++)
if(w[i]+lt[id[l]]>=x) cnt++;
return cnt;
}
for(int i=l;i<=ed[id[l]];i++)
if(w[i]+lt[id[l]]>=x) cnt++;
for(int i=id[l]+1;i<id[r];i++)
cnt+=ed[i]-(lower_bound(t+st[i],t+ed[i]+1,x-lt[i])-t)+1;
//注意这里 lower_bound(start,end, *x-lt[i]*) 别忘了考虑lazytag
// 另外lower_bound用法后面只用减去一个t,不用减去1,最后记得加一(r-l+1)
for(int i=st[id[r]];i<=r;i++)
if(w[i]+lt[id[r]]>=x) cnt++;
return cnt;
}
signed main(){
scanf("%d%d",&n,&q);
len=sqrt(n);
for(int i=1;i<=n;i++){
scanf("%d",&w[i]);
id[i]=(i-1)/len+1;//记住此公式
if(id[i]!=id[i-1]) st[id[i]]=i,ed[id[i-1]]=i-1;
}
ed[id[n]]=n;
while(q--){
char opt;int l,r,W;
cin>>opt;scanf("%d%d%d",&l,&r,&W);
if(opt=='M') add(l,r,W);
else printf("%d\n",query(l,r,W));
}
return 0;
}