[NOI2005]维修数列(二)
emp] = build ( mid + 1 , r ) ; push_up ( temp ) ; return temp ; } void print ( int rt ) { if ( !rt ) return ; print ( c[0][rt] ) ; printf ( "%d " , val[rt] ) ; print ( c[1][rt] ) ; } } tree ; int main() { int n , m , i , j , k , l , c ; while ( scanf ( "%d%d" , &n , &m ) != EOF ) { tree.init () ; int rt = 0 ; for ( i = 1 ; i <= n ; i ++ ) num[i] = fun () ; rt = tree.build ( 1 , n ) ; char op[1111] ; while ( m -- ) { scanf ( "%s" , op ) ; if ( op[0] == 'I' ) { j = fun () ; k = fun () ; for ( i = 1 ; i <= k ; i ++ ) { num[i] = fun () ; } rt = tree.Insert ( rt ,j , k ) ; } else if ( op[0] == 'D' ) { j = fun () ; k = fun () ; if ( k < 0 ) continue ; rt = tree.Del ( rt , j , k ) ; } else if ( op[0] == 'M' && op[1] == 'A' && op[2] == 'K' ) { j = fun () ; k = fun () ; c = fun () ; if ( k <= 0 ) continue ; rt = tree.Mk_sm ( rt , j , k , c ) ; } else if ( op[0] == 'G' ) { j = fun () ; k = fun () ; if ( k <= 0 ) { puts ( "0" ) ; continue ; } printf ( "%d\n" , tree.Get_sum ( rt , j , k ) ) ; } else if ( op[0] == 'R' ) { j = fun () ; k = fun () ; if ( k <= 1 ) continue ; rt = tree.Reverse ( rt , j , k ) ; } else { printf ( "%d\n" , tree.Max_sum ( rt ) ) ; } } } return 0; }