re求条
查看原帖
re求条
1260499
Kreacher楼主2025/6/14 15:34

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 ;
}
2025/6/14 15:34
加载中...