#9WA还有一些tle
因为还有tle所以尝试使用快读,但是使用快读后连样例都过不了了。
//没加快读
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6;
int n, a[N], v[N];
int l[N], r[N], pos[N];
int add[N];
inline void reset(int x){
for(int i=l[pos[x]];i<=r[pos[x]];i++) v[i]=a[i];
sort(v+l[pos[x]],v+1+r[pos[x]]);
}
inline void change(int x,int y,int d) {
int p=pos[x],q=pos[y];
if(p==q) {
for(int i=x;i<=y;i++) a[i]+=d;
reset(x);
}
else {
for(int i=p+1;i<=q-1;i++) add[i]+=d;
for(int i=x;i<=r[p];i++) a[i]+=d;
for(int i=l[q];i<=y;i++) a[i]+=d;
reset(x);
reset(l[q]);
}
return ;
}
inline int ef (int l,int r,int x) {
int rr=r;
while(l<r) {
int mid=(l+r)/2;
if(v[mid]<x) l=mid+1;
else r=mid;
}
if(v[l]<x) return 0;
return (rr-l)+1;
}
inline int ask(int x,int y,int c){
int p=pos[x],q=pos[y];
int ans=0;
if(p==q) {
for(int i=x;i<=y;i++) if(a[i]+add[p] >= c) ans++;
return ans;
}
else {
for(int i=p+1;i<=q-1;i++) {
int find=c-add[i];
ans+=ef(l[i],r[i],find);
}
for(int i=x;i<=r[p];i++) if(a[i]+add[p] >= c) ans++;
for(int i=l[q];i<=y;i++) if(a[i]+add[q] >= c) ans++;
return ans;
}
}
signed main() {
ios::sync_with_stdio(0);
int T;
cin>>n>>T;
for(int i=1;i<=n;i++) {
cin>>a[i];
v[i]=a[i];
}
int t=sqrt(n);
for(int i=1;i<=t;i++) {
l[i]=(i-1)*t+1, r[i]=i*t;
sort(v+l[i],v+r[i]+1);
}
if(r[t]<n) { t++; l[t]=r[t-1]+1,r[t]=n; }
for(int i=1;i<=t;i++) {
for(int j=l[i];j<=r[i];j++) pos[j]=i;
}
while(T--) {
char Q;int x,y,z;
cin>>Q;
cin>>x>>y>>z;
if(Q=='M') change(x,y,z);
else cout<<ask(x,y,z)<<endl;
}
return 0;
}
//加了快读
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6;
int n, a[N], v[N];
int l[N], r[N], pos[N];
int add[N];
inline void reset(int x){
for(int i=l[pos[x]];i<=r[pos[x]];i++) v[i]=a[i];
sort(v+l[pos[x]],v+1+r[pos[x]]);
}
inline void change(int x,int y,int d) {
int p=pos[x],q=pos[y];
if(p==q) {
for(int i=x;i<=y;i++) a[i]+=d;
reset(x);
}
else {
for(int i=p+1;i<=q-1;i++) add[i]+=d;
for(int i=x;i<=r[p];i++) a[i]+=d;
for(int i=l[q];i<=y;i++) a[i]+=d;
reset(x);
reset(l[q]);
}
return ;
}
inline int ef (int l,int r,int x) {
int rr=r;
while(l<r) {
int mid=(l+r)/2;
if(v[mid]<x) l=mid+1;
else r=mid;
}
if(v[l]<x) return 0;
return (rr-l)+1;
}
inline int ask(int x,int y,int c){
int p=pos[x],q=pos[y];
int ans=0;
if(p==q) {
for(int i=x;i<=y;i++) if(a[i]+add[p] >= c) ans++;
return ans;
}
else {
for(int i=p+1;i<=q-1;i++) {
int find=c-add[i];
ans+=ef(l[i],r[i],find);
}
for(int i=x;i<=r[p];i++) if(a[i]+add[p] >= c) ans++;
for(int i=l[q];i<=y;i++) if(a[i]+add[q] >= c) ans++;
return ans;
}
}
signed main() {
ios::sync_with_stdio(0);
int T;
cin>>n>>T;
for(int i=1;i<=n;i++) {
cin>>a[i];
v[i]=a[i];
}
int t=sqrt(n);
for(int i=1;i<=t;i++) {
l[i]=(i-1)*t+1, r[i]=i*t;
sort(v+l[i],v+r[i]+1);
}
if(r[t]<n) { t++; l[t]=r[t-1]+1,r[t]=n; }
for(int i=1;i<=t;i++) {
for(int j=l[i];j<=r[i];j++) pos[j]=i;
}
while(T--) {
char Q;int x,y,z;
cin>>Q;
cin>>x>>y>>z;
if(Q=='M') change(x,y,z);
else cout<<ask(x,y,z)<<endl;
}
return 0;
}
大佬们帮忙看看