Liyuqiao11 @ 2023-02-08 17:32:31
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
#define int long long
vector<int> v[N];
int n,q,id[N],len,b[N],a[N];
void add(int l,int r,int x){
int sid=id[l],eid=id[r];
if(sid==eid){
for(int i=l;i<=r;i++){
for(int j=0;j<v[sid].size();j++){
if(a[i]==v[sid][j]){
v[sid][j]+=x;
break;
}
}
a[i]+=x;
}
sort(v[sid].begin(),v[sid].end(),greater<int>());
return;
}
for(int i=l;id[i]==sid;i++){
for(int j=0;j<v[sid].size();j++){
if(a[i]==v[sid][j]){
v[sid][j]+=x;
break;
}
}
a[i]+=x;
}
for(int i=sid+1;i<eid;i++){
b[i]+=x;
}
for(int i=r;id[i]==eid;i--){
for(int j=0;j<v[eid].size();j++){
if(a[i]==v[eid][j]){
v[eid][j]+=x;
break;
}
}
a[i]+=x;
}
sort(v[sid].begin(),v[sid].end(),greater<int>());
sort(v[eid].begin(),v[eid].end(),greater<int>());
}
int query(int l,int r,int c){
int ans=0,sid=id[l],eid=id[r];
if(sid==eid){
for(int i=l;i<=r;i++){
if(a[i]+b[id[i]]>=c){
ans++;
}
}
return ans;
}
for(int i=l;id[i]==sid;i++){
if(a[i]+b[id[i]]>=c){
ans++;
}
}
for(int i=sid+1;i<eid;i++){
ans+=v[i].end()-lower_bound(v[i].begin(),v[i].end(),c-b[i]);
}
for(int i=r;id[i]==eid;i--){
if(a[i]+b[id[i]]>=c){
ans++;
}
}
return ans;
}
signed main(){
cin>>n>>q;
len=sqrt(n);
for(int i=1;i<=n;i++){
cin>>a[i];
id[i]=(i-1)/len+1;
v[id[i]].push_back(a[i]);
}
for(int i=1;i<=q;i++){
char op;
int l,r,x,c;
cin>>op;
if(op=='M'){
cin>>l>>r>>x;
add(l,r,x);
}
if(op=='A'){
cin>>l>>r>>c;
cout<<query(l,r,c)<<endl;
}
}
return 0;
}
by Liyuqiao11 @ 2023-02-08 22:32:49
此贴结,我把排序排成降序了,以及我一开始没排序qwq