40pts求助

P2801 教主的魔法

zyc1219 @ 2024-12-15 20:23:02


#include<bits/stdc++.h>
using namespace std;
int a[1000005],b[1000005],pos[1000005],add[1005];
int st[1005],ed[1005];
void change(int L,int R,int w){
    int p=pos[L],q=pos[R];
    if(p==q){
        for(int i=L;i<=R;i++) b[i]+=w;
        for(int i=st[p];i<=ed[p];i++) a[i]=b[i];
        sort(a+st[p],a+ed[p]+1);
    }else{
        for(int i=p+1;i<=q-1;i++) add[i]+=w;
        for(int i=L;i<=ed[p];i++) b[i]+=w;
        for(int i=st[p];i<=ed[p];i++) a[i]=b[i];
        sort(a+st[p],a+ed[p]+1);
        for(int i=st[q];i<=R;i++) b[i]+=w;
        for(int i=st[q];i<=ed[q];i++) a[i]=b[i];
        sort(a+st[q],a+ed[q]+1);
    }
}
void ask(int L,int R,int w){
    int p=pos[L],q=pos[R],ans=0;
    if(p==q){
        for(int i=L;i<=R;i++)
            if(b[i]+add[i]>=w)
                ans++;
    }else{
        for(int i=p+1;i<=q-1;i++){
            int k=lower_bound(a+st[i],a+ed[i],w-add[i])-a;
            if(k<=ed[i]){
                k=ed[i]-k+1;
                ans+=k;
            }
        }
        for(int i=L;i<=ed[p];i++) 
            if(b[i]+add[i]>=w)ans++;
        for(int i=st[q];i<=R;i++)
            if(b[i]+add[i]>=w)ans++;
    }
    cout<<ans<<'\n';
}
int main(){
    int n,q;
    scanf("%d%d",&n,&q);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        b[i]=a[i];
    }
    int block=sqrt(n),t=n/block;
    if(n%block)t++;
    for(int i=1;i<=t;i++){
        st[i]=(i-1)*block+1;
        ed[i]=block*i;
    }
    ed[t]=n;
    for(int i=1;i<=n;i++)pos[i]=(i-1)/block+1;
    for(int i=1;i<=t;i++)sort(a+st[i],a+ed[i]+1);
    while(q--){
        char ch;
        cin>>ch;
        int l,r,w;
        scanf("%d%d%d",&l,&r,&w);
        if(ch=='M')change(l,r,w);
        else ask(l,r,w);
    }
    return 0;
}

|