WA50,求调

P1253 扶苏的问题

wangziyue_AK @ 2024-02-17 17:00:56

#include <bits/stdc++.h>
using namespace std;
const int N=1e6+5;
const int M=405;
const long long inf=1e18;
typedef long long ll;
int n,q,bel[N],r[N],cnt;
ll a[N],add[M],b[M],bj[M];
void gai(int l,int rr,int be,ll x){
    b[be]=-inf;
    for(int i=r[be-1]+1;i<=r[be];i++){
        if(bj[be]!=-inf&&(i<l||i>rr)) a[i]=bj[be];
        else if(i>=l&&i<=rr) a[i]=x;
        b[be]=max(b[be],a[i]);  
    }
    bj[be]=-inf;
    add[be]=0;
    return;
}
void jia(int l,int rr,int be,ll x){
    for(int i=r[be-1]+1;i<=r[be];i++){
        if(bj[be]!=-inf&&(i<l||i>rr)) a[i]=bj[be];
        else if(bj[be]!=-inf&&i>=l&&i<=rr) a[i]=bj[be]+x;
        else if(i>=l&&i<=rr) a[i]+=x;
        b[be]=max(b[be],a[i]+add[be]);  
    }
    bj[be]=-inf;
    return;
}
int main(){
    scanf("%d%d",&n,&q);
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    int kk=sqrt(n),now=0;
    while(now<n){
        cnt++;
        now=min(n,now+kk);
        r[cnt]=now;
    }
    now=1;
    b[now]=-inf;
    add[now]=0;
    bj[now]=-inf;
    for(int i=1;i<=n;i++){
        if(i>r[now]){
            now+=1;
            b[now]=-inf;
            add[now]=0;
            bj[now]=-inf;
        }
        bel[i]=now;
        b[now]=max(a[i],b[now]);
    }
    int op,l,rr;
    ll k;
    while(q--){
        scanf("%d%d%d",&op,&l,&rr);
        int bl=bel[l],br=bel[rr];
        if(op==3){
            ll ans=-inf;
            if(bl==br){
                for(int i=l;i<=rr;i++) ans=max(ans,a[i]+add[bl]);
                printf("%lld\n",ans);
                continue;
            }
            for(int i=bl+1;i<=br-1;i++) ans=max(ans,b[i]);
            if(bj[bl]!=-inf) ans=max(ans,bj[bl]+add[bl]);
            else for(int i=l;i<=r[bl];i++) ans=max(ans,a[i]+add[bl]);
            if(bj[br]!=-inf) ans=max(ans,bj[br]+add[br]);
            else for(int i=r[br-1]+1;i<=rr;i++) ans=max(ans,a[i]+add[br]);
            printf("%lld\n",ans);
        }else{
            scanf("%lld",&k);
            if(op==1){
                if(bl==br){
                    gai(l,rr,bl,k);
                    continue;
                }
                gai(l,r[bl],bl,k);
                gai(r[br-1]+1,rr,br,k);
                for(int i=bl+1;i<=br-1;i++){
                    bj[i]=k;
                    b[i]=bj[i];
                    add[i]=0;
                }
            }else{
                if(bl==br){
                    jia(l,rr,bl,k);
                    continue;
                }
                jia(l,r[bl],bl,k);
                jia(r[br-1]+1,rr,br,k);
                for(int i=bl+1;i<=br-1;i++){
                    add[i]+=k;
                    b[i]+=k;
                }
            }
        }
    }
    return 0;
}

|