AC
# include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10 ;
int w[ N] ;
struct Node {
int l, r;
int mx;
int pre, suf;
int sum;
} tr[ N<< 2 ] ;
void pushup ( Node& u, Node & l, Node & r) {
u. mx= max ( l. suf+ r. pre, max ( l. mx, r. mx) ) ;
u. pre= max ( l. pre, l. sum+ r. pre) ;
u. suf= max ( r. suf, r. sum+ l. suf) ;
u. sum= l. sum+ r. sum;
}
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] = { r, r, w[ r] , w[ r] , w[ r] , w[ r] } ;
else {
tr[ u] = { l, r} ;
int mid = l+ r>> 1 ;
build ( u<< 1 , l, mid) ;
build ( u<< 1 | 1 , mid+ 1 , r) ;
pushup ( u) ;
}
}
void mody ( int u, int x, int c) {
if ( tr[ u] . l== x && tr[ u] . r == x) tr[ u] = { x, x, c, c, c, c} ;
else {
int mid = tr[ u] . l+ tr[ u] . r>> 1 ;
if ( x<= mid) mody ( u<< 1 , x, c) ;
else mody ( u<< 1 | 1 , x, c) ;
pushup ( u) ;
}
}
Node quary ( int u, int l, int r) {
if ( l<= tr[ u] . l && tr[ u] . r<= r) return tr[ u] ;
else {
int mid = tr[ u] . l+ tr[ u] . r>> 1 ;
Node tree;
if ( r<= mid) tree= quary ( u<< 1 , l, r) ;
else if ( l> mid) tree= quary ( u<< 1 | 1 , l, r) ;
else {
auto left = quary ( u<< 1 , l, r) ;
auto right = quary ( u<< 1 | 1 , l, r) ;
pushup ( tree, left, right) ;
}
return tree;
}
}
int main ( ) {
int n, m;
scanf ( "%d%d" , & n, & m) ;
for ( int i = 1 ; i<= n; i ++ ) scanf ( "%d" , w+ i) ;
build ( 1 , 1 , n) ;
while ( m-- ) {
int op;
int x, y;
scanf ( "%d%d%d" , & op, & x, & y) ;
if ( op== 1 ) {
if ( x> y) swap ( x, y) ;
printf ( "%d\n" , quary ( 1 , x, y) . mx) ;
} else {
mody ( 1 , x, y) ;
}
}
return 0 ;
}