//hdoj1754 I Hate It
//线段树,单点更新求最值
#include <cstdio>
#include <string>
#include <iostream>
using namespace std;
const int MAXN = 200010;
#define L(x) (x) << 1
#define R(x) (x) << 1 | 1
struct Node{
int left ,right;
int max;
}tree[MAXN * 3];
int arr[MAXN];
int nN, nM;
int Max(int x, int y){
return x > y ? x : y;
}
void build(int root, int left, int right){
tree[root].left = left;
tree[root].right = right;
if(left == right){
tree[root].max = arr[left];
return;
}
int mid = (left + right) >> 1;
build(L(root), left, mid);
build(R(root), mid + 1, right);
tree[root].max = Max(tree[L(root)].max, tree[R(root)].max);
}
void update(int root, int pos, int val){
if(tree[root].max < val)
tree[root].max = val;
if(tree[root].left == tree[root].right)
return ;
int mid = (tree[root].left + tree[root].right) >> 1;
if(mid >= pos)
update(L(root), pos, val);
else
update(R(root), pos, val);
}
int getMax(int root, int left, int right){
if(tree[root].left == left && tree[root].right == right)
return tree[root].max;
int mid = (tree[root].left + tree[root].right) >> 1;
if(left > mid)
return getMax(R(root), left, right);
else if(right <= mid)
return getMax(L(root), left, right);
else
return Max(getMax(L(root), left, mid), getMax(R(root), mid + 1, right));
}
int main(){
while(cin >> nN >> nM){
memset(tree, 0, sizeof(tree));
for(int i = 1; i <= nN; i++)
scanf("%d", &arr[i]);
build(1, 1, nN);
char order;
for(int i = 1; i <= nM; i++){
getchar();
order = getchar();
if(order == 'Q'){
int l, r;
scanf("%d %d", &l, &r);
printf("%d\n", getMax(1, l, r));
}else{
int p, v;
scanf("%d %d", &p, &v);
update(1, p, v);
}
}
}
return 0;
}
hdoj1754_I Hate It_线段树_单点更新求最值
最新推荐文章于 2016-07-27 09:39:15 发布