hdu 1754 线段树

来源:互联网 发布:外链网盘源码 编辑:程序博客网 时间:2024/05/17 18:02

AC代码如下:

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;#define MAX 220000int Max[4*MAX];//注意这里int leftchild( int parent ){    return parent * 2;}int rightchild( int parent ){    return parent * 2 + 1;}void PushUp( int rt ){    Max[rt] = max( Max[leftchild(rt)], Max[rightchild(rt)] );}void built( int l, int r, int rt ){    if( l == r ){        scanf( "%d", &Max[rt] );        return;    }    int mid = ( l + r ) >> 1;    built( l, mid, leftchild( rt ) );    built( mid + 1, r, rightchild( rt ) );    PushUp( rt );}void Updata( int id, int score, int L, int R, int rt ){    if( L == R ){        Max[rt] = score;        return;    }    int mid = ( L + R ) >> 1;    if( id <= mid ) Updata( id, score, L, mid, leftchild( rt ) );    else Updata( id, score, mid + 1, R, rightchild( rt ) );    PushUp( rt );}int query( int l, int r, int L, int R, int rt ){    if( l <= L && r >= R ){        return Max[rt];    }    int mid = ( L + R ) >> 1;    int ans = 0;    if( l <= mid )  ans = max( ans, query( l, r, L, mid, leftchild( rt ) ) );    if( r > mid )   ans = max( ans, query( l, r, mid + 1, R, rightchild( rt ) ) );    return ans;}int main(){    int N, M;    while( scanf( "%d%d", &N, &M ) != EOF ){        built( 1, N, 1 );        for( int i= 0; i < M; i++ ){            char s[10];            int temp1, temp2;            scanf( "%s%d%d", s, &temp1, &temp2 );            if( s[0] == 'Q' ){                printf( "%d\n", query( temp1, temp2, 1, N, 1 ) );            }else{                Updata( temp1, temp2, 1, N, 1 );            }        }    }    return 0;}


0 0