rt,wa了Subtask #1的第一个点
数据:
input:
100 5
40 7 47 44 52 81 87 60 82 49 40 30 44 90 62 68 81 44 46 17 44 71 89 79 44 95 57 4 6 36 26 61 62 64 14 93 46 35 20 98 55 6 71 9 85 31 1 70 93 100 82 33 57 14 83 56 40 67 27 53 43 39 44 4 59 32 49 72 91 60 67 84 16 64 9 21 59 30 100 34 47 62 10 9 56 88 19 20 16 92 22 11 68 56 62 16 77 94 20 10
M 66 67 1
M 82 97 13
M 14 90 20
M 47 76 7
A 58 86 80
output:
13
我的输出:
12
代码:
#include<bits/stdc++.h>
using namespace std;
int n,q;
int sn,tot;
long long a[1000010],e[1000010];
int belong[1000010];
int _l[1010],_r[1010];
long long add[1010];
void rebuild(int l,int r){
for(int i=l;i<=r;i++){
e[i]=a[i];
}
sort(e+l,e+r+1);
}
void init(){
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sn=sqrt(n);
tot=(n+sn-1)/sn;
for(int i=1;i<=tot;i++){
_l[i]=(i-1)*sn+1;
_r[i]=min(i*sn,n);
for(int j=_l[i];j<=_r[i];j++){
belong[j]=i;
}
rebuild(_l[i],_r[i]);
}
}
void modify(int l,int r,int w){
if(belong[l]==belong[r]){
for(int i=l;i<=r;i++){
a[i]+=w;
}
rebuild(l,r);
}else{
for(int i=l;i<=_r[belong[l]];i++){
a[i]+=w;
}
for(int i=_l[belong[r]];i<=r;i++){
a[i]+=w;
}
rebuild(_l[belong[l]],_r[belong[l]]);
rebuild(_l[belong[r]],_r[belong[r]]);
for(int i=belong[l]+1;i<=belong[r]-1;i++){
add[i]+=w;
}
}
}
void ask(int l,int r,int c){
int ans=0;
if(belong[l]==belong[r]){
for(int i=l;i<=r;i++){
ans+=a[i]+add[belong[i]]>=c;
}
}else{
for(int i=l;i<=_r[belong[l]];i++){
ans+=a[i]+add[belong[i]]>=c;
}
for(int i=_l[belong[r]];i<=r;i++){
ans+=a[i]+add[belong[i]]>=c;
}
for(int i=belong[l]+1;i<=belong[r]-1;i++){
ans+=e+_r[i]+1-lower_bound(e+_l[i],e+_r[i]+1,c-add[i]);
}
}
cout<<ans<<endl;
}
void solve(){
while(q--){
char op;
int l,r,w;
cin>>op>>l>>r>>w;
if(op=='M'){
modify(l,r,w);
}else if(op=='A'){
ask(l,r,w);
}
}
}
int main(){
init();
solve();
return 0;
}