玄关求调
查看原帖
玄关求调
358753
Ggt__楼主2024/11/5 13:27

90pts

WA on Sub#0#12 Sub#1#1

#include<bits/stdc++.h>
using namespace std;
int n,a[1000001],s,num,tag[1001];
vector<int> block[1001];
void assign(int x){
    block[x].clear();
    for(int i=(x-1)*s+1;i<=min(n,x*s);++i) block[x].push_back(a[i]);
    sort(block[x].begin(),block[x].end());
}
int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int q;
    cin>>n>>q;
    for(int i=1;i<=n;++i) cin>>a[i];
    s=sqrt(n);
    num=(n-1)/s+1;
    for(int i=1;i<=n;++i){
        block[(i-1)/s+1].push_back(a[i]);
    }
    for(int i=1;i<=num;++i) assign(i);
    while(q--){
        char op;
        int l,r,v;
        cin>>op>>l>>r>>v;
        if(op=='M'){
            int i=l;
            for(;i<=min(r,((l-1)/s+1)*s);++i) a[i]+=v;
            assign((l-1)/s+1);
            if(i>r) continue;
            for(;i<=(r-1)/s*s;i+=s) tag[(i-1)/s+1]+=v;
            for(;i<=r;++i) a[i]+=v;
            assign((r-1)/s+1);
        }
        if(op=='A'){
            int ans=0;
            int i=l;
            for(;i<=min(r,((l-1)/s+1)*s);++i){
                if(a[i]>=v) ++ans;
            }
            for(;i<=(r-1)/s*s;i+=s){
                int x=(i-1)/s+1;
                ans=ans+block[x].end()-lower_bound(block[x].begin(),block[x].end(),v-tag[x]);
            }
            for(;i<=r;++i){
                if(a[i]>=v) ++ans;
            }
            cout<<ans<<'\n';
        }
    }
}
2024/11/5 13:27
加载中...