你能回答这些问题吗(单点修改+带跨区间查询:最长连续子段和)无懒标
# include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10 ;
int n, m;
int w[ N] ;
struct Node {
int l, r;
int sum, lmax, rmax, tmax;
} tr[ N* 4 ] ;
void pushup ( Node & root, Node & left, Node & right) {
root. sum= left. sum+ right. sum;
root. lmax= max ( left. lmax, left. sum+ right. lmax) ;
root. rmax= max ( right. sum+ left. rmax, right. rmax) ;
root. tmax= max ( { left. tmax, right. tmax, right. lmax+ left. rmax} ) ;
}
void pushup ( int u) {
pushup ( tr[ u] , tr[ u<< 1 ] , tr[ u<< 1 | 1 ] ) ;
}
void build ( int u, int l, int r) {
if ( l== r) {
tr[ u] = { l, r, w[ l] , w[ l] , w[ l] , w[ l] } ;
}
else {
int mid= l+ r>> 1 ;
tr[ u] = { l, r} ;
build ( u<< 1 , l, mid) ;
build ( u<< 1 | 1 , mid+ 1 , r) ;
pushup ( u) ;
}
}
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) ;
else if ( l> mid) return query ( u<< 1 | 1 , l, r) ;
else {
Node x;
auto left= query ( u<< 1 , l, mid) ;
auto right= query ( u<< 1 | 1 , mid+ 1 , r) ;
pushup ( x, left, right) ;
return x;
}
}
}
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) ;
}
}
int main ( ) {
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) ;
cout<< query ( 1 , x, y) . tmax<< endl;
}
else {
modify ( 1 , x, y) ;
}
}
return 0 ;
}