90pts,最后一个过不去,悬赏关注求大佬帮忙!stO

P2801 教主的魔法

warmingcium @ 2023-01-23 17:31:02


#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[1000006];
int st[1006][1006];
int block[1003];
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    int n,q;
    cin>>n>>q;
    int siz=sqrt(n);
    int j=-1;

    for(int i=0;i<n;i++){
        cin>>a[i];
        if(i%siz==0){
            sort(st[j],st[j]+siz);
            j++;
        }
        st[j][i%siz]=a[i];
    }

//  for(int i=0;i<10;i++){
//      for(int k=0;k<10;k++) cout<<st[i][k]<<" ";
//      cout<<endl; 
//  }
    char op; int l,r,c;
    while(q--){
        cin>>op;
        cin>>l>>r>>c;
        l--; r--;
        int lb=l/siz;
        int rb=r/siz;

        if(op=='M'){
            if(lb==rb){
                for(int i=l;i<=r;i++) a[i]+=c; 
            }else{
                for(int i=l;i<(lb+1)*siz;i++) a[i]+=c;
                for(int i=lb*siz;i<lb*siz+siz;i++) st[lb][i%siz]=a[i];
                sort(st[lb],st[lb]+siz);
                for(int i=lb+1;i<rb;i++) block[i]+=c;
                for(int i=siz*rb;i<=r;i++) a[i]+=c;
                for(int i=rb*siz;i<rb*siz+siz;i++) st[rb][i%siz]=a[i];
                sort(st[rb],st[rb]+siz);
            }
        }

        if(op=='A'){
            int ans=0;
            if(lb==rb) for(int i=l;i<=r;i++){
                if(a[i]>=c) ans++;
            }
            if(lb!=rb){
                for(int i=l;i<(lb+1)*siz;i++) if(a[i]>=c) ans++;
                for(int i=siz*rb;i<=r;i++) if(a[i]>=c) ans++;
                for(int i=lb+1;i<rb;i++) ans+=(siz-(lower_bound(st[i],st[i]+siz,c-block[i])-st[i]));
            }
            printf("%lld\n",ans);
        }

    }
    return 0;
}

|