#include<iostream>//区间修改+区间查询 比某个数小的数的个数
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=5e5+10,K=250;
#define int long long
int n;
int len;
int a[N];
int loc[K];//判断数属于那个块
int cop[N];//操作sort时存下数
struct node{
int l,r;
int lazy;//lazy存块整体处理的数
}bkl[K];
int tot;
void reset(int x){//sort块
for(int i=bkl[x].l;i<=bkl[x].r;i++){
cop[i]=a[i]+bkl[x].lazy;
a[i]+=bkl[x].lazy;
}
bkl[x].lazy=0;
sort(cop+bkl[x].l+1,cop+bkl[x].r+1);
}
inline int read(){
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
void CZ(int l,int r,int val){
int st=loc[l],en=loc[r];//那些块
if(st==en){//在一个块内
for(int i=l;i<=r;i++)a[i]+=val;
reset(st);
}else{//不在一个块
for(int i=l;i<=bkl[st].r;i++)a[i]+=val;//左边
reset(st);
for(int i=bkl[en].l;i<=r;i++)a[i]+=val;//右边
reset(en);
for(int i=st+1;i<en;i++)bkl[i].lazy+=val;//中间的块
}
}
int query(int l,int r,int c){
int ans=0;
int st=loc[l],en=loc[r];
if(st==en){
for(int i=l;i<=r;i++)if(a[i]+bkl[st].lazy<c) ans++;
}else{
for(int i=l;i<=bkl[st].r;i++)if(a[i]+bkl[st].lazy<c) ans++;
for(int i=bkl[en].l;i<=r;i++)if(a[i]+bkl[en].lazy<c) ans++;
for(int i=st+1;i<en;i++) ans+=lower_bound(cop+bkl[i].l,cop+bkl[i].r+1,c-bkl[i].lazy)-(cop+bkl[i].l);
}
return ans;
}
signed main(){
cin>>n;
for(int i=1;i<=n;++i){
a[i]=read();
}
int len=sqrt(n);
tot=n/len;
if(n%len) tot++;
for(int i=1;i<=n;++i){
loc[i]=(i-1)/len+1;
}
for(int i=1;i<=tot;++i){
bkl[i].l=(i-1)*len+1;
bkl[i].r=(i)*len;
}
bkl[tot].r=n;
for(int i=1;i<=tot;++i){
reset(i);
}
while(n--){
int x,y,val,op;
op=read(),x=read(),y=read(),val=read();
if(op==0){
CZ(x,y,val);
}else{
printf("%lld\n",query(x,y,val*val));
}
}
return 0;
}
分块哪里出问题了,求大佬orz