蒟蒻0pts求助
查看原帖
蒟蒻0pts求助
535996
Blanc_min楼主2023/1/13 20:48
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll tot,ans,t,mod,m,k,n,a,b,z;
ll x;
struct bb {
    ll l,r,mxl,mxr,mx,sum;
}tree[1000001];
void updata(ll x) {
    tree[x].sum=tree[x*2].sum+tree[x*2+1LL].sum;
    tree[x].mxl=max(tree[x*2].mxl,tree[x*2].sum+tree[x*2+1LL].mxl);
    tree[x].mxr=max(tree[x*2].mxr,tree[x*2+1LL].mxl+tree[x*2].sum);
    tree[x].mx=max(max(tree[x*2].mx,tree[x*2+1LL].mx),tree[x*2].mxr+tree[x*2+1LL].mxl);
}
void build(ll x,ll l,ll r) {
    tree[x].l=l;
    tree[x].r=r;
    if(l!=r) {
        ll mid;
        mid=(l+r)/2;
        build(x*2,l,mid);
        build(x*2+1LL,mid+1LL,r);
    }
    if(l==r) {
        tree[x].sum=0;
        tree[x].mxl=tree[x].mxr=tree[x].mx=tree[x].sum;
        return ;
    }
    updata(x);
}
void push(ll x,ll k,ll p) {
    if(p<tree[x].l||tree[x].r<p) return;
    if(tree[x].l==p&&tree[x].r==p) {
        tree[x].mxl=tree[x].mxr=tree[x].mx=tree[x].sum=k;
        return ; 
    }
    push(x*2,k,p);
    push(x*2+1,k,p);
    updata(x);
}
bb find(ll k,ll l,ll r)
{
    if(l<=tree[k].l&&tree[k].r<=r) return tree[k];
    ll mid=(tree[k].l+tree[k].r)/2;
    if(l<=mid) return find(k*2,l,r);
    else
    {
        if(r>mid) return find(k*2+1,l,r);
        else
        {
            bb t,a=find(k*2,l,r),b=find(k*2+1,l,r);
            t.sum=a.sum+b.sum;
            t.mxl=max(a.mxl,a.sum+b.mxl);
            t.mxr=max(a.mxr,b.mxl+a.sum);
            t.mx=max(max(a.mx,b.mx),a.mxr+b.mxl);
            return t;
        }
    }
}
int main() {
    cin>>n>>m;
    build(1LL,1LL,n);
    for(ll i=1;i<=n;i++) {
        cin>>x;
        push(1,1,x);
    }
    for(ll i=1;i<=m;i++) {
        cin>>x;
        if(x==1) {
            cin>>a>>b;
            if(a>b) swap(a,b);
            cout<<find(1LL,a,b).mx<<endl;
        }
        else {
            cin>>a>>b;
            push(1,a,b);
        }
    }
    return 0;
}
2023/1/13 20:48
加载中...