题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754
考查线段树。今天刚学习了线段树的知识,看的一知半解...大概原理了解了,拿一道简单题练手下。
#include <cstdio>
#define MAX ( 200000 + 10 )
int num[MAX];
typedef struct {
int left;
int right;
int value;
} SegmentTree;
SegmentTree tree[MAX * 20];
void buildSegmentTree( int root, int left, int right ) {
tree[root].left = left;
tree[root].right = right;
if( left == right ) {
tree[root].value = num[left];
return ;
}
int mid = ( left + right ) / 2 ;
buildSegmentTree( 2 * root, left, mid );
buildSegmentTree( 2 * root + 1, mid + 1, right );
if( tree[2 * root].value >= tree[2 * root + 1].value ) {
tree[root].value = tree[2 * root].value;
}
else {
tree[root].value = tree[2 * root + 1].value;
}
}
int query( int root, int left, int right ) {
if( tree[root].left > right || tree[root].right < left ) {
return 0;
}
if( left <= tree[root].left && tree[root].right <= right ) {
return tree[root].value;
}
int a = query( 2 * root, left, right );
int b = query( 2 * root + 1, left, right );
return ( a > b ? a : b );
}
int update( int root, int pos, int val ) {
if( pos < tree[root].left || pos > tree[root].right ) {
return tree[root].value;
}
if( tree[root].left == pos && tree[root].right == pos ) {
return tree[root].value = val;
}
int a = update( 2 * root, pos, val );
int b = update( 2 * root + 1, pos, val );
tree[root].value = ( a > b ? a : b );
return tree[root].value;
}
int main() {
int i;
int n, m;
int x, y;
char c;
while( scanf( "%d%d", &n, &m ) != EOF ) {
for( i = 1; i <= n; i++ ) {
scanf( "%d", &num[i] );
}
buildSegmentTree( 1, 1, n );
for( i = 1; i <= m; i++ ) {
getchar();
scanf( "%c%d%d", &c, &x, &y );
if( c == 'Q' ) {
printf( "%d\n", query( 1, x, y ) );
}
else {
num[x] = y;
update( 1, x, y );
}
}
}
return 0;
}