5 6 1 2 3 4 5 Q 1 5 U 3 6 Q 3 4 Q 4 5 U 2 9 Q 1 5
5 6 5 9HintHuge input,the C function scanf() will work better than cin
线段树功能:update:单点替换 query:区间最值
#include <cstdio> #include <stdlib.h> #include <algorithm> #include <math.h> #include <string.h> using namespace std; #define lson l , m , rt<<1 #define rson m+1 , r , rt<<1|1 const int maxn = 222222; int Max[maxn<<2]; int n,m; void PushUP( int rt ) { Max[rt] = max( Max[rt<<1] , Max[rt<<1|1] ); } void build( int l , int r , int rt ) { if( l == r ) { scanf("%d",&Max[rt]); return ; } int m = (l+r) >> 1; build( lson ); build( rson ); PushUP( rt ); } int query( int L , int R , int l , int r , int rt ) { if( L <= l && r <= R ) { return Max[rt]; } int ret = 0; int m = ( l+r ) >> 1; if( L <= m ) ret = max(ret , query( L , R , lson )); if( R > m ) ret = max(ret , query( L , R , rson )); return ret; } void update( int p , int sc , int l , int r , int rt ) { if( l == r ) { Max[rt] = sc; return ; } int m = ( l+r ) >> 1; if( p > m ) update( p , sc , rson ); else update( p , sc , lson ); PushUP( rt ); } int main( ) { while( scanf("%d%d",&n,&m) == 2 ){ build( 1 , n , 1 ); //for( int i=1 ; i<=n ; i++ ) // printf("%d\n",Max[i]); char op[5]; for( int i=0 ; i<m ; i++ ){ scanf("%s",op); int a,b; scanf("%d%d",&a,&b); if( op[0] == 'Q' ) printf("%d\n",query( a,b,1,n,1 )); else if( op[0] == 'U' ) update( a,b,1,n,1 ); } } return 0; }