代码:与HDU1166敌兵布阵相似,都是线段树的简单应用。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 200010;
const int inf = 0x3f3f3f3f;
struct segTree{
int l, r;
int v;
}T[3*N];
void BuildTree(int l, int r, int k) {
T[k].l = l, T[k].r = r;
if(T[k].l == T[k].r) {
scanf("%d", &T[k].v);
return;
}
int mid = (T[k].l + T[k].r) / 2;
BuildTree(l, mid, 2*k);
BuildTree(mid+1, r, 2*k+1);
T[k].v = max(T[2*k].v , T[2*k+1].v);
}
void Update(int c, int v, int k) {
if(T[k].l == T[k].r && T[k].l == c) {
T[k].v = v;
return;
}
int mid = (T[k].l + T[k].r) / 2;
if(c <= mid) {
Update(c, v, 2*k);
}
else if(c > mid) {
Update(c, v, 2*k+1);
}
T[k].v = max( T[2*k].v, T[2*k+1].v);
}
int maxNum;
void Query(int l, int r, int k) {
if(l > T[k].r || r < T[k].l) { //越界
return;
}
if (l <= T[k].l && T[k].r <= r) {
maxNum = max(maxNum, T[k].v);
return; //这里经常忘了return,要牢记啊。
}
int mid = (T[k].l + T[k].r) / 2;
if(r <= mid)
Query(l, r, 2*k);
else if(l > mid)
Query(l, r, 2*k+1);
else{
Query(l, mid, 2*k);
Query(mid+1, r, 2*k+1);
}
}
int main() {
int n, m;
while(scanf("%d %d", &n, &m) != EOF) {
BuildTree(1, n , 1);
char op;
int u, v;
for(int i = 1; i <= m; i++) {
getchar(); //读取上面的回车符,有多余输出,想了半天才发现是读取字符的问题
scanf("%c", &op);
scanf("%d %d", &u, &v);
if(op == 'U') {
Update(u, v, 1);
}else {
maxNum = -inf;
Query(u, v, 1);
printf("%d\n", maxNum);
}
}
}
return 0;
}