以下代码:
#include <bits/stdc++.h>
#define int long long
#define lson ( pos << 1 )
#define rson ( pos << 1 | 1 )
using namespace std ;
int n , m , ll , rr , k , a[1000005] ;
struct SegTree{
int max ;//区间最大子段和
int maxl ;//包含左端点最大子段和
int maxr ;//包含右端点最大字段和
int sum ;//区间和
};
SegTree tre[2400005] ;
void pushup( int pos ){
tre[pos].sum = tre[lson].sum + tre[rson].sum ;
tre[pos].maxl = max ( tre[lson].maxl , tre[lson].sum + tre[rson].maxl );
tre[pos].maxr = max ( tre[rson].maxr , tre[rson].sum + tre[lson].maxr );
if( tre[lson].maxr < 0 && tre[rson].maxl < 0 ){
tre[pos].max = max( tre[lson].maxr , tre[rson].maxl );
}else{
tre[pos].max = max( max( tre[lson].maxr , tre[rson].maxl) , max( max( (tre[lson].sum + tre[rson].maxl ) , tre[rson].sum + tre[lson].maxr) , tre[lson].maxr + tre[rson].maxl));
}
return ;
}
void build( int pos , int l , int r ){
if( l == r ){
tre[pos].sum = a[l] ;
tre[pos].maxl = a[l] ;
tre[pos].maxr = a[l] ;
tre[pos].max = a[l] ;
return ;
}
int mid ;
mid = ( l + r ) >> 1 ;
build( lson , l , mid ) ;
build( rson , mid+1 , r );
pushup( pos );
return ;
}
void update( int pos , int l , int r , int p , int s){
if( l == r ){
tre[pos].max = s ;
tre[pos].maxl = s ;
tre[pos].maxr = s ;
tre[pos].sum = s ;
return ;
}
int mid ;
mid = ( l + r ) >> 1 ;
if( p <= mid ){
update( lson , l , mid , p , s );
}else{
update( rson , mid+1 , r , p , s );
}
pushup( pos );
return ;
}
SegTree query( int pos , int l , int r , int ql , int qr ){
if( ql <= l && qr >= r ){
return tre[pos] ;
}
int mid ;
mid = ( l + r ) >> 1 ;
if( ql <= mid && mid < qr ){
SegTree res , resl , resr ;
resl = query( lson , l , mid , ql , qr );
resr = query( rson , mid+1 , r , ql , qr );
res.maxl = max( resl.maxl , ( resl.sum + resr.maxl ));
res.maxr = max( resr.maxr , ( resr.sum + resl.maxr ));
res.max = max( (resl.maxr + resr.maxl) , max( resl.max , resr.max ));
return res ;
}else{
if( ql <= mid ){
return query( lson , l , mid , ql , qr );
}else{
return query( rson , mid+1 , r , ql , qr );
}
}
}
signed main(){
scanf("%lld%lld" , &n , &m );
for( int i = 1 ; i <= n ; ++ i ){
scanf( "%lld" , &a[i] );
}
build( 1 , 1 , n );
for( int i = 1 ; i <= m ; ++ i ){
scanf( "%lld%lld%lld" , &k , &ll , &rr );
if( k == 1 ){
if( ll > rr ){
swap( ll , rr );
}
SegTree
ans = query( 1 , 1 , n , ll , rr );
cout << ans.max << endl;
}
if( k == 2 ){
update( 1 , 1 , n , ll , rr );
}
}
return 0 ;
}
感谢大佬!好人一生平安!