rt,所有点全RE,本地能过,下载样例也能过,救救孩子
#include <bits/stdc++.h>
using namespace std ;
#define int long long
const int N = 5e5 + 10 ;
int n , w , a[ 4 * N ] ;
struct node
{
int l , r , lmax , rmax , sum , ans ;
friend node operator + ( node ls , node rs )
{
node res ;
res . lmax = max ( ls . lmax , ls . sum + rs . lmax ) ;
res . rmax = max ( rs . rmax , rs . sum + ls . rmax ) ;
res . sum = ls . sum + rs . sum ;
res . ans = max ( max ( ls . ans , rs . ans ) , ls . rmax + rs . lmax ) ;
return res ;
}
} tr[ 4 * N ] ;
void pushup ( int u )
{
tr [ u ] = tr [ 2 * u ] + tr [ 2 * u + 1 ] ;
}
void build ( int u , int l , int r )
{
tr[ u ] . l = l ;
tr[ u ] . r = r ;
if ( l == r )
{
tr[ u ] . sum = a[ l ] ;
tr[ u ] . lmax = a[ l ] ;
tr[ u ] . rmax = a[ l ] ;
tr[ u ] . ans = a[ l ] ;
return ;
}
int mid = ( l + r ) / 2 ;
build ( 2 * u , l , mid ) ;
build ( 2 * u + 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 ] ;
int mid = ( tr[ u ] . l + tr[ u ] . r ) / 2 ;
if ( l <= mid && r > mid )
return query ( 2 * u , l , r ) + query ( 2 * u + 1 , l , r ) ;
else if ( l <= mid )
{
return query ( 2 * u , l , r ) ;
}
else
{
return query ( 2 * u + 1 , l , r ) ;
}
}
void modify ( int u , int x , int y , int k )
{
if ( tr[ u ] . l >= x && tr[ u ] . r <= y )
{
tr [ u ] . sum = tr [ u ] . lmax = tr [ u ] . rmax = tr [ u ] . ans = k ;
return ;
}
int mid = ( tr[ u ] . l + tr[ u ] . r ) / 2 ;
if ( x <= mid )
modify ( 2 * u , x , y , k ) ;
if ( y > mid )
modify ( 2 * u + 1 , x , y , k ) ;
pushup ( u ) ;
}
void solve ( )
{
scanf ( "%lld%lld" , &n , &w ) ;
for ( int i = 1 ; i <= n ; i ++ )
scanf ( "%lld" , &a[ i ] ) ;
build ( 1 , 1 , n ) ;
int op , x , y , z ;
while ( w -- )
{
scanf ( "%lld%lld%lld" , &op , &x , &y ) ;
if ( op == 2 )
{
modify ( 1 , x , x , y ) ;
}
else if ( op == 1 )
{
printf ( "%lld\n" , query ( 1 , x , y ) . ans ) ;
}
}
return ;
}
signed main ( void )
{
solve ( ) ;
return 0 ;
}