萌新20分求助

P1253 扶苏的问题

Liyuqiao11 @ 2023-03-05 10:39:40

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
#define int long long
int len,id[N],n,q,a[N],maxn[N];
void fix(int l,int r,int x){
    int sid=id[l],eid=id[r];
    if(sid==eid){
        for(int i=l;i<=r;i++){
            a[i]=x;
        }
        maxn[sid]=-1e18;
        for(int i=(sid-1)*len+1;id[i]==sid;i++){
            maxn[sid]=max(maxn[sid],a[i]);
        }
        return;
    }
    for(int i=l;id[i]==sid;i++){
        a[i]=x;
    }
    maxn[sid]=-1e18;
    for(int i=(sid-1)*len+1;id[i]==sid;i++){
        maxn[sid]=max(maxn[sid],a[i]);
    }
    for(int i=sid+1;i<eid;i++){
        maxn[i]=x;
    }
    for(int i=r;id[i]==eid;i--){
        a[i]=x;
    }
    maxn[eid]=-1e18;
    for(int i=(eid-1)*len+1;id[i]==eid;i++){
        maxn[eid]=max(maxn[eid],a[i]);
    }
}
void add(int l,int r,int x){
    int sid=id[l],eid=id[r];
    if(sid==eid){
        for(int i=l;i<=r;i++){
            a[i]+=x;
        }
        maxn[sid]=-1e18;
        for(int i=(sid-1)*len+1;id[i]==sid;i++){
            maxn[sid]=max(maxn[sid],a[i]);
        }
        return;
    }
    for(int i=l;id[i]==sid;i++){
        a[i]+=x;
    }
    maxn[sid]=-1e18;
    for(int i=(sid-1)*len+1;id[i]==sid;i++){
        maxn[sid]=max(maxn[sid],a[i]);
    }
    for(int i=sid+1;i<eid;i++){
        maxn[i]+=x;
    }
    for(int i=r;id[i]==eid;i--){
        a[i]+=x;
    }
    maxn[eid]=-1e18;
    for(int i=(eid-1)*len+1;id[i]==eid;i++){
        maxn[eid]=max(maxn[eid],a[i]);
    }
}
int query(int l,int r){
    int sid=id[l],eid=id[r],maxnn=-1e18;
    if(sid==eid){
        for(int i=l;i<=r;i++){
            maxnn=max(maxnn,a[i]);
        }
        return maxnn;
    }
    for(int i=l;id[i]==sid;i++){
        maxnn=max(maxnn,a[i]);
    }
    for(int i=sid+1;i<eid;i++){
        maxnn=max(maxnn,maxn[i]);
    }
    for(int i=r;id[i]==eid;i--){
        maxnn=max(maxnn,a[i]);
    }
    return maxnn;
}
signed main(){
    cin>>n>>q;
    len=sqrt(n);
    memset(maxn,128,sizeof(maxn));
    for(int i=1;i<=n;i++){
        cin>>a[i];
        id[i]=(i-1)/len+1;
        maxn[id[i]]=max(maxn[id[i]],a[i]);
    }
    for(int i=1;i<=q;i++){
        int op,l,r,x;
        cin>>op;
        if(op==1){
            cin>>l>>r>>x;
            fix(l,r,x);
        }
        if(op==2){
            cin>>l>>r>>x;
            add(l,r,x);
        }
        if(op==3){
            cin>>l>>r;
            cout<<query(l,r)<<endl;
        }
    }
    return 0;
}

|