在 DEV 上运行的好好的,放洛谷上就 0pts 了。
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n,Q,a[N],b[N],lazy[N],len,id[N],l[N],r[N];
inline int work(int x)
{
for(int i=l[id[x]];i<=r[id[x]];i++) b[i]=a[i];
sort(b+l[id[x]],b+r[id[x]]+1);
}
inline void Add(int l,int r,int k)
{
int L=id[l],R=id[r];
if(L==R)
{
for(int i=l;i<=r;i++) a[i]+=k;
work(l);
return;
}
for(int i=l;id[i]==L;i++) a[i]+=k;
work(l);
for(int i=L+1;i<R;i++) lazy[i]+=k;
for(int i=r;id[i]==R;i--) a[i]+=k;
work(r);
}
inline int solve(int x,int key)
{
int _left=l[x],_right=r[x];
while(_left<=_right)
{
int mid=_left+((_right-_left)>>1);
if(b[mid]<key) _left=mid+1;
else _right=mid-1;
}
return r[x]-_left+1;
}
inline int query(int l,int r,int k)
{
int L=id[l],R=id[r],ans=0;
if(L==R)
{
for(int i=l;i<=r;i++) ans+=(a[i]+lazy[L]>=k);
return ans;
}
for(int i=l;id[i]==L;i++) ans+=(a[i]+lazy[L]>=k);
for(int i=L+1;i<R;i++) ans+=solve(i,k-lazy[i]);
for(int i=r;id[i]==R;i--) ans+=(a[i]+lazy[R]>=k);
return ans;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin>>n>>Q;
for(int i=1;i<=n;i++) cin>>a[i];
len=sqrt(n);
for(int i=1;i<=n;i++)
{
id[i]=1+(i-1)/len;
b[i]=a[i];
l[i]=(i-1)*len+1;
r[i]=i*len;
}
int tot=n/len+(n%len);
r[tot]=n;
for(int i=1;i<=tot;i++) sort(b+l[i],b+r[i]+1);
while(Q--)
{
char type;
int l,r,k;
cin>>type>>l>>r>>k;
if(type=='M') Add(l,r,k);
else cout<<query(l,r,k)<<'\n';
}
return 0;
}