代码如下:样例能过qmq
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int M=2e5+110;
inline int read(){
int sum=0,k=1;char c=getchar();
while(c>'9'||c<'0'){if(c=='-')k=-1;c=getchar();
}while(c>='0'&&c<='9'){sum=sum*10+c-48;c=getchar();
}return sum*k;
}
struct _fenkuai{
int lz,rz,lazy;
}fk[M];
int n,a[M],pos[M],bl;
inline void opt_0(int l,int r,int c){
int ql=pos[l],qr=pos[r];
if(ql==qr){
for(int i=l;i<=r;i++) a[i]+=c;
sort(a+fk[ql].lz,a+1+fk[qr].rz);
return ;
}
for(int i=l;i<=fk[ql].rz;i++) a[i]+=c;
sort(a+fk[ql].lz,a+1+fk[ql].rz);
for(int i=fk[qr].lz;i<=r;i++) a[i]+=c;
sort(a+fk[qr].lz,a+1+fk[qr].rz);
for(int i=ql+1;i<qr;i++) fk[i].lazy+=c;
}
inline int fin(int l,int r,int c){
if(a[l]>=c) return 0;
if(a[r]<c) return r-l+1;
int ll=l,rr=r,mid;
while(ll<rr) {
mid=(ll+rr)>>1;
if(a[mid]<c) ll=mid+1;
else rr=mid-1;
}
return ll-l+1;
}
inline void opt_1(int l,int r,int c){
c=c*c;
int ql=pos[l],qr=pos[r],cnt=0;
if(ql==qr){
printf("%lld\n",fin(l,r,c-fk[ql].lazy));
return ;
}
cnt+=fin(l,fk[ql].rz,c-fk[ql].lazy);
cnt+=fin(fk[qr].lz,r,c-fk[qr].lazy);
for(int i=ql+1;i<qr;i++)
cnt+=fin(fk[i].lz,fk[i].rz,c-fk[i].lazy);
printf("%lld\n",cnt);
return ;
}
signed main(){
n=read(),bl=sqrt(n);
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=bl;i++) fk[i].lz=bl*(i-1)+1,fk[i].rz=bl*i;
if(fk[bl].rz<n) fk[++bl].rz=n,fk[bl].lz=fk[bl-1].rz+1;
for(int i=1;i<=bl;i++){
for(int j=fk[i].lz;j<=fk[i].rz;j++) pos[j]=i;
sort(a+fk[i].lz,a+fk[i].rz+1);
}
for(int i=1;i<=n;i++){
int opt=read(),l=read(),r=read(),c=read();
if(opt==0) opt_0(l,r,c);
if(opt==1) opt_1(l,r,c);
}
return 0;
}
/*
10
10 9 8 7 6 5 4 3 2 1
*/