只是把上次的代码求和改成了求最大值
不过意外的总是TLE
最后加了inline后才好
#include <cstdio>
#include <cstring>
#include <iostream>
#define N 200000 << 3
#define INF 99999999
#define lson root << 1
#define rson ( root << 1 ) | 1
using namespace std;
int Tree[ N ];
inline int max ( int a, int b ) { return a > b ? a : b; }
void build ( int root, int st, int end ) {
if ( st == end )
scanf ( "%d", &Tree[ root ] );
else {
int mid = ( st + end ) / 2;
build ( lson, st, mid );
build ( rson, mid + 1, end );
Tree[ root ] = max ( Tree[ lson ], Tree[ rson ] );
}
}
int query ( int root, int ST, int END, int st, int end ) {
if ( st > END || end < ST )
return -INF;
if ( st <= ST && end >= END )
return Tree[ root ];
int mid = ( ST + END ) / 2;
return max ( query ( lson, ST, mid, st, end ), query ( rson, mid + 1, END, st, end ) );
}
void update ( int root, int st, int end, int indx, int val ) {
if ( st == end ) {
if ( st == indx )
Tree[ root ] = val;
return;
}
int mid = ( st + end ) / 2;
if ( indx <= mid )
update ( lson, st, mid, indx, val );
else
update ( rson, mid + 1, end, indx, val );
Tree[ root ] = max ( Tree[ lson ], Tree[ rson ] );
}
int main () {
int n, m;
while ( ~scanf ( "%d%d", &n, &m ) ) {
memset ( Tree, 0, sizeof ( Tree ) );
build ( 1, 1, n );
while ( m-- ) {
char s;
getchar ();
int a, b;
scanf ( "%c%d%d", &s, &a, &b );
if ( s == 'U' )
update ( 1, 1, n, a, b );
if ( s == 'Q' )
printf ( "%d\n", query ( 1, 1, n, a, b ) );
}
}
return 0;
}