求助大佬

P2801 教主的魔法

B_1168 @ 2018-04-16 20:38:53

6T3W1AC,求助大佬…………qwq

#include<bits/stdc++.h>
using namespace std;

const int maxn=1000010,maxs=1001;

int a[maxn],kr[maxn],be[maxn],l[maxs],r[maxs],tag[maxs],p,n,len,num=0;

inline void res(int L,int R){
    for(int i=L;i<=R;i++)kr[i]=a[i];
    sort(kr+l[be[L]],kr+r[be[R]]+1);
}

inline void query(int L,int R,int q){
    int ans=0;
    if(be[L]==be[R]){
        for(int i=L;i<=R;i++){
            if(a[i]+tag[be[L]]>=q)ans++;
        }
        printf("%d\n",ans);
    }
    else{
        for(int i=L;i<=r[be[L]];i++){
            if(a[i]+tag[be[L]]>=q)ans++;
        }
        for(int i=l[be[R]];i<=R;i++){
            if(a[i]+tag[be[R]]>=q)ans++;
        }
        for(int i=be[L]+1;i<=be[R]-1;i++){
            ans+=r[i]-(lower_bound(kr+l[i],kr+r[i]+1,q-tag[i])-kr)+1;
        }
        printf("%d\n",ans);
    }
}

inline void modify(int L,int R,int q){
    if(be[L]==be[R]){//same section
        for(int i=L;i<=R;i++)a[i]+=q;
        res(L,R);
    }
    else{//cross_sectioned
        for(int i=L;i<=r[be[L]];i++)a[i]+=q;
        res(L,r[be[L]]);
        for(int i=l[be[R]];i<=R;i++)a[i]+=q;
        res(l[be[R]],R);//(at most 2)side parts
        for(int i=be[L]+1;i<=be[R]-1;i++)tag[i]+=q;//whole sectioned
    }
}

int main(){
    scanf("%d%d",&n,&p);
    int len=sqrt(n);
    int num=n/len;
    if (n%len) num++;
    for(int i=1;i<=num;i++)l[i]=(i-1)*len+1,r[i]=i*len;
    for(register int i=1;i<=n;i++)be[i]=(i-1)/len+1;
    for(register int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        kr[i]=a[i];
    }
    for(int i=1;i<=num;i++){
        res(l[i],r[i]);
    }
    for(int i=1;i<=p;i++){
        char tmp;
        int x=0,y=0,z=0;
        scanf("%c%d%d%d\n",&tmp,&x,&y,&z);
        if(tmp=='A'){
            query(x,y,z);
        }
        if(tmp=='M'){
            modify(x,y,z);
        }
    }
}

|