蒟蒻求助!!!大佬们帮忙看看吧 WA 20pts

P2801 教主的魔法

wuyiduo @ 2022-04-25 21:35:38

#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
const int sN=1020;
int n,q,wx[N],yx[N],add[sN],size,ll,rr,cc;
char opt;
int cal(int x){
    return (x-1)/size+1;
}
void qs(int x){
    for(int i=(x-1)*size+1;i<=min(x*size,n);i++) yx[i]=wx[i];
    sort(yx+(x-1)*size+1,yx+min(x*size,n)+1);
}
void modify(int a,int b,int w){
    int l=cal(a),r=cal(b);
    if(l==r){
        for(int i=a;i<=b;i++) wx[i]+=w;
        qs(l);
    }
    else{
        for(int i=a;i<=l*size;i++) wx[i]+=w;
        qs(l);
        for(int i=l+1;i<r;i++) add[i]+=w;
        for(int i=(r-1)*size+1;i<=b;i++) wx[i]+=w;
        qs(r);
    }
}
int query(int a,int b,int c){
    int ans=0;
    int l=cal(a),r=cal(b);
    if(l==r){
        for(int i=a;i<=b;i++)
            if(wx[i]+add[l]>=c) ans++;
    }
    else{
        for(int i=a;i<=l*size;i++)
            if(wx[i]+add[l]>=c) ans++;
        for(int i=l+1;i<r;i++){
            int del=lower_bound(yx+(i-1)*size+1,yx+i*size+1,c-add[l])-&yx[(i-1)*size]-1;
            ans+=size-del;
        }
        for(int i=(r-1)*size+1;i<=b;i++)
            if(wx[i]+add[r]>=c) ans++;
    }
    return ans;
}
int main(){
    scanf("%d%d",&n,&q);
    for(int i=1;i<=n;i++) scanf("%d",&wx[i]);
    size=sqrt(n);
    int sum=n/size+1;
    if(n%size==0) sum--;
    for(int i=1;i<=sum;i++) qs(i);
    while(q--){
        cin>>opt;
        scanf("%d%d%d",&ll,&rr,&cc);
        if(opt=='M') modify(ll,rr,cc);
        else printf("%d\n",query(ll,rr,cc));
    }
    return 0;
}

|