10分求调,样例未过

P1253 扶苏的问题

liwenxi114514 @ 2024-04-04 16:43:47

#include<bits/stdc++.h>
#define int long long
#define ls k<<1
#define rs k<<1|1
#define pup tree[k].maxn=max(tree[ls].maxn,tree[rs].maxn)
#define qmi int mid=(tree[k].l+tree[k].r)>>1
using namespace std;
int n,m,a[1000005];
struct node{
    int l,r,maxn,fgtag,smtag;
}tree[4000005];
inline void build(int l,int r,int k){
    tree[k].l=l;
    tree[k].r=r;
    if(l==r){
        tree[k].maxn=a[l];
        tree[k].fgtag=1e9+1;
        return ;
    }
    qmi;
    build(l,mid,ls);
    build(mid+1,r,rs);
    pup;
}
inline void coverpd(int k){
    if(tree[k].fgtag!=1e9+1){
        tree[ls].smtag=tree[rs].smtag=0;
        tree[ls].maxn=tree[rs].maxn=tree[k].fgtag;
        tree[ls].fgtag=tree[rs].fgtag=tree[k].fgtag;
        tree[k].fgtag=1e9+1;
    }
    return ;
}
inline void sumpd(int k){
    if(tree[k].smtag){
        coverpd(k);
        tree[ls].maxn+=tree[k].smtag;
        tree[rs].maxn+=tree[k].smtag;
        tree[ls].smtag+=tree[k].smtag;
        tree[rs].smtag+=tree[k].smtag;
        tree[k].smtag=0;
    }
    return ;
}
inline void update1(int l,int r,int x,int k){
    if(tree[k].l<=l&&tree[k].r>=r){
        tree[k].fgtag=x;
        tree[k].smtag=0;
        tree[k].maxn=x;
        return  ;
    }
    coverpd(k);
    sumpd(k);
    qmi;
    if(l<=mid){
        update1(l,r,x,ls);
    }
    if(r>mid){
        update1(l,r,x,rs);
    }
    pup;
    return ;
}
inline void update2(int l,int r,int x,int k){
    if(tree[k].l<=l&&tree[k].r>=r){
        coverpd(k);
        tree[k].maxn+=x;
        tree[k].smtag+=x;
        return  ;
    }
    coverpd(k);
    sumpd(k);
    qmi;
    if(l<=mid){
        update2(l,r,x,ls);
    }
    if(r>mid){
        update2(l,r,x,rs);
    }
    pup;
    return ;
}
inline int query(int l,int r,int k){
    if(tree[k].l<=l&&tree[k].r>=r){
        return tree[k].maxn;
    }
    coverpd(k);
    sumpd(k);
    qmi;
    int maxn=INT_MIN;
    if(l<=mid){
        maxn=max(maxn,query(l,r,ls));
    }
    if(r>mid){
        maxn=max(maxn,query(l,r,rs));
    }
    return maxn;
}
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=4*n;i++){
        tree[i].fgtag=1e9+1;
    }
    build(1,n,1);
    while(m--){
        int id;
        cin>>id;
        if(id==1){
            int x,y,z;
            cin>>x>>y>>z;
            update1(x,y,z,1); 
        }else if(id==2){
            int x,y,z;
            cin>>x>>y>>z;
            update2(x,y,z,1);
        }else{
            int x,y;
            cin>>x>>y;
            cout<<query(x,y,1)<<"\n";
        }
    }
    return 0;
}

by liwenxi114514 @ 2024-04-08 17:23:35

@sto_0616allen_orz


by sto_0616allen_orz @ 2024-04-08 21:32:20

@liwenxi114514 我敲,找我干嘛?找这个神犇@LHQ_lihongqian


|