50分求大佬条

P1253 扶苏的问题

DNWdpl @ 2024-11-20 18:52:39

#include<bits/stdc++.h>
#define int long long

using namespace std;

const int N=1e6+5;
const int MAXN=1e9+5;
struct node{
    int max,l,r,lzsum,lzcover;
}tree[4*N];
int a[N];

void build_tree(int p,int l,int r){
    tree[p].l=l,tree[p].r=r;
    tree[p].lzcover=MAXN;
    if(l==r){
        tree[p].max=a[l];
        return ;
    }
    int mid=(l+r)>>1;
    build_tree(p*2,l,mid);
    build_tree(p*2+1,mid+1,r);
    tree[p].max=max(tree[p*2].max,tree[p*2+1].max);
}

void push_downsum(int p){
    if(tree[p].lzsum!=0){
        tree[p*2].max+=tree[p].lzsum;
        tree[p*2+1].max+=tree[p].lzsum;
        tree[p*2].lzsum+=tree[p].lzsum;
        tree[p*2+1].lzsum+=tree[p].lzsum;
        tree[p].lzsum=0;
    }
}

void push_downcover(int p){
    if(tree[p].lzcover!=MAXN){
        tree[p*2].max=tree[p].lzcover;
        tree[p*2+1].max=tree[p].lzcover;
        tree[p*2].lzcover=tree[p].lzcover;
        tree[p*2+1].lzcover=tree[p].lzcover;
        tree[p].lzcover=0;
    }
}

void coverchange(int p,int l,int r,int z){
    if(tree[p].l>=l&&tree[p].r<=r){
        tree[p].max=z;
        tree[p].lzcover=z;
        return ;
    }
    push_downcover(p);
    if(tree[p*2].r>=l) coverchange(p*2,l,r,z);
    if(tree[p*2+1].l<=r) coverchange(p*2+1,l,r,z);
    tree[p].max=max(tree[p*2].max,tree[p*2+1].max);
}

void sumchange(int p,int l,int r,int z){
    if(tree[p].l>=l&&tree[p].r<=r){
        tree[p].max+=z;
        tree[p].lzsum+=z;
        return ;
    }
    push_downsum(p);
    if(tree[p*2].r>=l) sumchange(p*2,l,r,z);
    if(tree[p*2+1].l<=r) sumchange(p*2+1,l,r,z);
    tree[p].max=max(tree[p*2].max,tree[p*2+1].max);
}
int ask(int p,int l,int r){
    if(tree[p].l>=l&&tree[p].r<=r){
        return tree[p].max;
    }
    push_downcover(p);
    push_downsum(p);
    int ans=0;
    if(tree[p*2].r>=l) ans=max(ask(p*2,l,r),ans);
    if(tree[p*2+1].l<=r) ans=max(ask(p*2+1,l,r),ans);
    return ans;
}
signed main(){
    //freopen("p1253_6.in","r",stdin);
    //freopen("p12536.out","w",stdout);
    int n,m;
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
    }
    build_tree(1,1,n);
    while(m--){
        int qwe,l,r,k;
        scanf("%lld",&qwe);
        if(qwe==1){
            scanf("%lld%lld%lld",&l,&r,&k);
            coverchange(1,l,r,k);
        }else if(qwe==2){
            scanf("%lld%lld%lld",&l,&r,&k);
            sumchange(1,l,r,k);
        }else{
            scanf("%lld%lld",&l,&r);
            cout<<ask(1,l,r)<<endl;
        }
    } 
    return 0;
}

by 熊猫尤里安41 @ 2024-11-29 17:52:21

把ans改为最小值


|