萌新64分求助

P4513 小白逛公园

_M1Ku_ @ 2023-02-23 17:58:03

芝士记录

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<climits>
using namespace std;

#define maxn 500000
#define ll long long
#define ls(x) (x<<1)
#define rs(x) ((x<<1) | 1)

inline ll read();

struct node{
    ll s,sl,sr,sum;
};
ll n,m;
ll base[maxn];
node t[(maxn<<2)+10];

void push_up(ll rt){
    node la=t[ls(rt)],ra=t[rs(rt)];
    t[rt].sum=la.sum+ra.sum;
    t[rt].sl=max(la.sl,la.sum+ra.sl);
    t[rt].sr=max(ra.sr,ra.sum+la.sr);
    t[rt].s=max(max(la.s,ra.s),la.sr+ra.sl);
}

void build(ll rt,ll l,ll r){
    ll mid=(l+r) >> 1;
    if(l==r){
        t[rt].sl=base[l];t[rt].sr=base[l];t[rt].s=base[l],t[rt].sum=base[l];
        return;
    }
    build(ls(rt),l,mid);
    build(rs(rt),mid+1,r);
    push_up(rt);
    //cout<<l<<" " << r<<": "<<t[rt].s<<endl;
}

void change(ll rt,ll l,ll r,ll p,ll v){
    if(l==r){
        t[rt].sl=v;t[rt].sr=v;t[rt].s=v;t[rt].sum=v;
        return;
    }
    ll mid=(l+r)>>1;
    if(p<=mid){
        change(ls(rt),l,mid,p,v);
    }
    else{
        change(rs(rt),mid+1,r,p,v);
    }
    push_up(rt);
}

node query(ll rt,ll l,ll r,ll ql,ll qr){
    if(ql<=l && r<=qr){
        return t[rt];
    }
    ll mid=(l+r)>>1;
    if(mid>=qr){
        return query(ls(rt),l,mid,ql,qr);
    }
    if(mid<ql){
        return query(rs(rt),mid+1,r,ql,qr);
    }
    node res,a,b;
    a=query(ls(rt),l,mid,ql,qr);
    b=query(rs(rt),mid+1,r,ql,qr);
    res.sl=max(a.sl,a.sum+b.sl);
    res.sr=max(b.sr,b.sum+a.sr);
    res.s=max(max(a.s,b.s),a.sr+b.sl);
    res.sum=a.sum+b.sum;
    return res;
}

int main()
{
    n=read(),m=read();
    for(int i=1;i<=n;++i)   base[i]=read();
    build(1,1,n);
    for(int i=1;i<=m;i++){
        ll type=read();
        if(type==1){
            ll a=read(),b=read();
            node ans=query(1,1,n,min(a,b),max(a,b));
            printf("%lld\n",ans.s);
        }
        if(type==2){
            ll p=read(),v=read();
            change(1,1,n,p,v);
        }
    }
    return 0;
}
ll read(){ll w=1,x=0;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0' && ch<='9'){x=x*10+(ch-'0');ch=getchar();}return x*w;}

|