传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1756
L>R
Code:
#include<bits/stdc++.h> using namespace std; const int maxn=5e5+5; int a[maxn]; struct node{ int ls,ss,rs,sum; node():ls(-1e9),rs(-1e9),ss(-1e9),sum(0){}; }; node operator+(node a,node b){ node ans; ans.ls=max(a.ls,a.sum+b.ls); ans.rs=max(b.rs,b.sum+a.rs); ans.ss=max(ans.ls,ans.rs); ans.ss=max(ans.ss,a.ss); ans.ss=max(ans.ss,b.ss); ans.ss=max(ans.ss,a.rs+b.ls); ans.sum=a.sum+b.sum; return ans; } node t[maxn<<2]; struct seg{ #define lson i<<1,l,mid #define rson i<<1|1,mid+1,r #define L i<<1 #define R i<<1|1 void build(int i,int l,int r){ if(l==r){ t[i].ls=t[i].rs=t[i].ss=t[i].sum=a[l]; return; }int mid=(l+r)>>1; build(lson);build(rson); t[i]=t[L]+t[R]; } void Change(int i,int l,int r,int ps,int x){ if(l==r){ t[i].ls=t[i].rs=t[i].ss=t[i].sum=x; return; }int mid=(l+r)>>1; if(ps<=mid)Change(lson,ps,x); else Change(rson,ps,x); t[i]=t[L]+t[R]; } node Qss(int i,int l,int r,int l0,int r0){ if(l0<=l&&r0>=r) return t[i]; int mid=(l+r)>>1;node ans; if(l0<=mid)ans=Qss(lson,l0,r0)+ans; if(r0>mid)ans=ans+Qss(rson,l0,r0); return ans; } }T; int n,m; int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)scanf("%d",&a[i]); T.build(1,1,n); while(m--){ int op,x,y;scanf("%d%d%d",&op,&x,&y); if(op==1){ if(x>y)swap(x,y); printf("%d\n",T.Qss(1,1,n,x,y).ss); }else{ T.Change(1,1,n,x,y); } } }