思路
代码
#include <cstring>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int N= 500010 ;
int w[ N] ;
struct Node{
int l, r;
int lmax, rmax, sum, tmax;
} tr[ N* 4 ] ;
void pushup ( int u, int lnode, int rnode) {
tr[ u] . sum= tr[ lnode] . sum+ tr[ rnode] . sum;
tr[ u] . lmax= max ( tr[ lnode] . lmax, tr[ lnode] . sum+ tr[ rnode] . lmax) ;
tr[ u] . rmax= max ( tr[ rnode] . rmax, tr[ rnode] . sum+ tr[ lnode] . rmax) ;
tr[ u] . tmax= max ( max ( tr[ lnode] . tmax, tr[ rnode] . tmax) , tr[ lnode] . rmax+ tr[ rnode] . lmax) ;
}
void pushup ( Node & u, Node & l, Node & r) {
u. sum = l. sum + r. sum;
u. lmax = max ( l. lmax, l. sum + r. lmax) ;
u. rmax = max ( r. rmax, r. sum + l. rmax) ;
u. tmax = max ( max ( l. tmax, r. tmax) , l. rmax + r. lmax) ;
}
void build ( int u, int l, int r) {
if ( l== r) {
tr[ u] = { l, r, w[ l] , w[ l] , w[ l] , w[ l] } ;
}
else {
tr[ u] = { l, r} ;
int mid= tr[ u] . l+ tr[ u] . r>> 1 ;
build ( u<< 1 , l, mid) ;
build ( u<< 1 | 1 , mid+ 1 , r) ;
pushup ( u, u<< 1 , u<< 1 | 1 ) ;
}
}
Node query ( int u, int l, int r) {
if ( tr[ u] . l>= l&& tr[ u] . r<= r) return tr[ u] ;
else {
int mid= tr[ u] . l+ tr[ u] . r>> 1 ;
if ( r<= mid) return query ( u<< 1 , l, r) ;
if ( l>= mid+ 1 ) return query ( u<< 1 | 1 , l, r) ;
Node left= query ( u<< 1 , l, r) ;
Node right= query ( u<< 1 | 1 , l, r) ;
Node res;
pushup ( res, left, right) ;
return res;
}
}
void modify ( int u, int x, int v)
{
if ( tr[ u] . l == x && tr[ u] . r == x) tr[ u] = { x, x, v, v, v, v} ;
else
{
int mid = tr[ u] . l + tr[ u] . r >> 1 ;
if ( x <= mid) modify ( u << 1 , x, v) ;
else modify ( u << 1 | 1 , x, v) ;
pushup ( u, u << 1 , u << 1 | 1 ) ;
}
}
int main ( ) {
int n, m;
cin >> n >> m;
for ( int i= 1 ; i<= n; i++ ) cin >> w[ i] ;
build ( 1 , 1 , n) ;
while ( m-- ) {
int t, x, y;
cin >> t >> x >> y;
if ( t == 1 )
{
if ( x > y) swap ( x, y) ;
printf ( "%d\n" , query ( 1 , x, y) . tmax) ;
} else {
modify ( 1 , x, y) ;
}
}
}