//被我种得很复杂的线段树。。 //找环最大和区间。。不能包涵整个环(扑街的条件啊) //想法其实很简单存储左起最大值,右起最大值 #include <iostream> #include <cstdio> using namespace std; #define _mx 100001 struct Seg { int l, r, mxl, mxr, mx; //mxl mxr 左起右起最大值 mx 最大值 int _mxl, _mxr; //左起右起最大值,不包含另一端点 int sum; //区间和 int mx_tw; //重点, 区间左起右起(环状)最大值,不包含中间部分 //不是只有根要更新mx_tw 因为上层mx一部分来源于这个变量 //出现的状况是比如,左区间贡献sum 右区间贡献mx_tw }seg[4*_mx]; int n, m, s[_mx], _p , v; void renew( int p ) //更新节点最大值 { //下面那五个比较常规 seg[p].sum = seg[2*p].sum + seg[2*p+1].sum; seg[p].mxl = max( seg[2*p].mxl, seg[2*p].sum + seg[2*p+1].mxl ); seg[p].mxr = max( seg[2*p+1].mxr,seg[2*p+1].sum + seg[2*p].mxr ); seg[p]._mxl = max( seg[2*p].mxl, seg[2*p].sum + seg[2*p+1]._mxl ); seg[p]._mxr = max( seg[2*p+1].mxr,seg[2*p+1].sum + seg[2*p]._mxr ); int d2 = seg[2*p]._mxl + seg[2*p+1].mxr; int d3 = seg[2*p].mxl + seg[2*p+1]._mxr; int d4 = max( seg[2*p].sum + seg[2*p+1].mx_tw,seg[2*p+1].sum + seg[2*p].mx_tw); seg[p].mx_tw = max( max( d2, d3 ),d4 ); //这个存注意跨两次区间的情况。。中间一次,环一次 if( p == 1 ) { int b1 = seg[2*p]._mxr+seg[2*p+1].mxl; int b2 = seg[2*p].mxr+seg[2*p+1]._mxl; int b = max( b1,b2 ); int d1 = max( seg[2*p].mx, seg[2*p+1].mx ); int d = max( d1,seg[p].mx_tw ); seg[p].mx = max( b ,d ); } else { int b = seg[2*p].mxr + seg[2*p+1].mxl; int d = max( seg[2*p].mx,seg[2*p+1].mx ); seg[p].mx = max(b,d); } } void buildTree( int l, int r, int p ) { seg[p].l = l; seg[p].r = r; if( l == r ) { seg[p].mxl = seg[p].mxr = seg[p].mx = seg[p].sum = s[l]; seg[p]._mxl = seg[p]._mxr = seg[p].mx_tw = 0; return ; } int mid = (l+r)/2; buildTree( l,mid,2*p ); buildTree( mid+1,r,2*p+1 ); renew(p); } void reset( int i, int p ) { if( seg[p].l == seg[p].r ) { seg[p].mxl = seg[p].mxr = seg[p].mx = seg[p].sum = s[i]; return ; } int mid = (seg[p].l + seg[p].r )/2; if( i <= mid ) reset( i,2*p ); else reset( i,2*p+1 ); renew( p ); } int main() { scanf("%d",&n); for( int i = 1;i <= n;i++ ) scanf( "%d",s+i ); buildTree( 1,n,1 ); scanf("%d",&m ); for( int i = 0;i < m;i++ ) { scanf("%d %d",&_p,&v ); s[_p] = v; reset( _p, 1 ); printf("%d/n",seg[1].mx ); } return 0; }