AcWing 245. 你能回答这些问题吗

 

 

#include<bits/stdc++.h>
using namespace std;
const int N=2e6+5,inf=-0x3f3f3f3f;
struct node{int l,r,sum,mx,dl,dr;}t[N];
int a[N],n,m,x,y,z;
void in(node &a,int val){a.mx=a.sum=a.dl=a.dr=val;}
void up(int k)
{
    t[k].sum=t[k<<1].sum+t[k<<1|1].sum;
    t[k].dl=max(t[k<<1].dl,t[k<<1].sum+t[k<<1|1].dl);
    t[k].dr=max(t[k<<1|1].dr,t[k<<1].dr+t[k<<1|1].sum);
    t[k].mx=max(max(t[k<<1].mx,t[k<<1|1].mx),t[k<<1].dr+t[k<<1|1].dl);
}
void build(int k,int l,int r)
{
    t[k].l=l;t[k].r=r;
    if(l==r){in(t[k],a[l]);return;}
    int mid=(l+r)>>1;
    build(k<<1,l,mid); build(k<<1|1,mid+1,r);
    up(k);
} 
void change(int k)
{
    if(t[k].l==t[k].r){in(t[k],y);return;}
    int mid=(t[k].l+t[k].r)>>1;
    if(x<=mid)change(k<<1);
    else change(k<<1|1);
    up(k);
}
node ask(int k)
{
    if(x<=t[k].l&&y>=t[k].r)return t[k];
    int mid=(t[k].l+t[k].r)>>1;
    node a,b,c;
    in(a,inf),in(b,inf);
    c.sum=0;
    if(x<=mid){a=ask(k<<1);c.sum+=a.sum;}
    if(y>mid){b=ask(k<<1|1);c.sum+=b.sum;}
    c.mx=max(max(a.mx,b.mx),a.dr+b.dl);
    c.dl=max(a.dl,a.sum+b.dl);
    if(x>mid)c.dl=b.dl;
    c.dr=max(b.dr,a.dr+b.sum);
    if(y<=mid)c.dr=a.dr;
    return c; 
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    build(1,1,n);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&z,&x,&y);
        if(z==1)
        {
            if(x>y)swap(x,y);
            printf("%d\n",ask(1).mx);
        }
        else change(1);
    }
    return 0;
}

 

posted @ 2021-02-02 11:12  君与  阅读(53)  评论(0编辑  收藏  举报