60分玄关求助

P1253 扶苏的问题

yjy_echo @ 2024-06-29 13:44:49

#include<bits/stdc++.h>
#define ls(p) p<<1
#define rs(p) p<<1|1
#define ll long long 
#define mid (t[u].l+t[u].r)/2
using namespace std;
const int N=1e6+10;
ll n,m,a,b,c,d,ans[N];
struct tree{
    ll l,r,sum,mul,add;
}t[N*4];
void pushup(ll u){
    t[u].sum=max(t[ls(u)].sum,t[rs(u)].sum);
}
void build(ll u,ll l,ll r){
    t[u].mul=LLONG_MIN;
    t[u].l=l,t[u].r=r;
    if(l==r){
        t[u].sum=ans[l];
        return ;
    }
    build(ls(u),l,mid);
    build(rs(u),mid+1,r);
    pushup(u);
}
void pushdown(ll u){
    if(!t[u].add&&t[u].mul==LLONG_MIN) return ;
    if(t[u].mul!=LLONG_MIN){
        t[ls(u)].mul+=t[u].mul;
        t[rs(u)].mul+=t[u].mul;
        t[ls(u)].sum=t[u].mul;
        t[rs(u)].sum=t[u].mul;
        t[u].mul=LLONG_MIN;
        t[u].add=0;
    }
    if(t[u].add){
        t[ls(u)].add+=t[u].add;
        t[rs(u)].add+=t[u].add;
        t[ls(u)].sum+=t[u].add;
        t[rs(u)].sum+=t[u].add;
        t[u].add=0;
    }
}
void update_add(ll u,ll l,ll r,ll k){
    if(t[u].r==0||t[u].l==0) return;
    if(l<=t[u].l&&t[u].r<=r){   
        t[u].add+=k;
        t[u].sum+=k;
        //cout<<u<<' '<<t[u].l<<' '<<t[u].r<<' '<<t[u].sum<<endl;
        return ;
    }
    pushdown(u);
    if(l<=mid) update_add(ls(u),l,r,k);
    if(r>mid) update_add(rs(u),l,r,k);
    pushup(u);
}
void update_mul(ll u,ll l,ll r,ll k){
    if(t[u].r==0||t[u].l==0) return;
    if(l<=t[u].l&&t[u].r<=r){   
        t[u].mul=k;
        t[u].sum=k;
        //cout<<u<<' '<<t[u].l<<' '<<t[u].r<<' '<<t[u].sum<<endl;
        return ;
    }
    pushdown(u);
    if(l<=mid) update_mul(ls(u),l,r,k);
    if(r>mid) update_mul(rs(u),l,r,k);
    pushup(u);
}
ll query(ll u,ll l,ll r){
    ll res=LLONG_MIN;
    if(t[u].l>r||t[u].r<l) return 0;
    if(t[u].l>=l&&t[u].r<=r) return t[u].sum;
    pushdown(u);
    if(l<=mid) res=max(res,query(ls(u),l,r));
    if(r>mid) res=max(res,query(rs(u),l,r));
    return res;
}
int main(){
    scanf("%lld%lld",&n,&m);
    for(ll i=1;i<=n;i++) scanf("%lld",&ans[i]);
    build(1,1,n);
    while(m--){
        scanf("%lld",&a);
        if(a==1){
            scanf("%lld%lld%lld",&b,&c,&d);
            update_mul(1,b,c,d);
        }
        else if(a==2){
            scanf("%lld%lld%lld",&b,&c,&d);
            update_add(1,b,c,d);
        }
        else if(a==3){
            scanf("%lld%lld",&b,&c);
            printf("%lld\n",query(1,b,c));
        }
    }
    return 0;
}

by 123huchenghao @ 2024-06-29 18:01:18

#include <bits/stdc++.h>
#define ls p<<1
#define rs p<<1|1
#define int long long
using namespace std;
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
    return x*f;
}
const int N=1e6+10;
const int INF=1e16;
struct node{
    int max;
    int add;
    int lazy;
}tree[N*16];
int n,m,a[N];
void pushup(int p){
    tree[p].max=max(tree[ls].max,tree[rs].max);
    return;
}
void pushdown(int p){
    if(tree[p].lazy!=-INF){
    tree[ls].lazy=tree[rs].lazy=tree[p].lazy;
    tree[ls].max=tree[rs].max=tree[p].lazy;
    tree[ls].add=tree[rs].add=0;
    tree[p].lazy=-INF;
    }
    if(tree[p].add){
    tree[ls].add+=tree[p].add;
    tree[rs].add+=tree[p].add;
    tree[ls].max+=tree[p].add;
    tree[rs].max+=tree[p].add;
    tree[p].add=0;
    }
}
void build(int p,int l,int r){
    tree[p].lazy=-INF;
    if(l==r){tree[p].max=a[l];return;}
    int mid=(l+r)>>1;
    build(ls,l,mid);
    build(rs,mid+1,r);
    pushup(p);
}
void upd1(int p,int l,int r,int x,int y,int k){
    if(x<=l&&y>=r){
    tree[p].max=k;
    tree[p].lazy=k;
    tree[p].add=0;
    return;
    }
    pushdown(p);
    int mid=(l+r)>>1;
    if(x<=mid) upd1(ls,l,mid,x,y,k);
    if(y>mid) upd1(rs,mid+1,r,x,y,k);
    pushup(p);
}
void upd2(int p,int l,int r,int x,int y,int k){
    if(x<=l&&y>=r){
    tree[p].max+=k;
    tree[p].add+=k;
    return;
    }
    pushdown(p);
    int mid=(l+r)>>1;
    if(x<=mid) upd2(ls,l,mid,x,y,k);
    if(y>mid) upd2(rs,mid+1,r,x,y,k);
    pushup(p);
}
int query(int p,int l,int r,int x,int y){
    int res=-INF;
    if(x<=l&&y>=r){
    res=max(res,tree[p].max);
    return res;
    }
    pushdown(p);
    int mid=(l+r)>>1;
    if(x<=mid) res=max(res,query(ls,l,mid,x,y));
    if(y>mid) res=max(res,query(rs,mid+1,r,x,y));
    return res;
}
signed main(){
    n=read();m=read();
    for(int i=1;i<=n;++i) a[i]=read();
    build(1,1,n);
    for(int i=1;i<=m;++i){
    int op=read();
    if(op==1){
        int l,r,x;
        l=read();r=read();x=read();
        upd1(1,1,n,l,r,x);
    }
    else if(op==2){
        int l,r,x;
        l=read();r=read();x=read();
        upd2(1,1,n,l,r,x);
    }
    else{
        int l,r;
        l=read();r=read();
        printf("%lld\n",query(1,1,n,l,r));
    }
    }
    return 0;
}

by Fish_Love_Water @ 2024-06-29 21:10:17

@123huchenghao ?


|