题目链接:

hdu: http://acm.hdu.edu.cn/showproblem.php?pid=1754

题解:

单点更新,成段查询。

代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define lson o<<1
#define rson (o<<1)|1
#define M l+(r-l)/2
using namespace std; const int maxn = 2e5 + ; int n, m;
int maxv[maxn<<]; void build(int o, int l, int r) {
if (l == r) {
scanf("%d", maxv + o);
}
else {
build(lson, l, M);
build(rson, M + , r);
maxv[o] = max(maxv[lson], maxv[rson]);
}
} int _po, _v;
void update(int o, int l, int r) {
if (l == r) {
maxv[o] = _v;
}
else {
if (_po <= M) update(lson, l, M);
else update(rson, M + , r);
maxv[o] = max(maxv[lson], maxv[rson]);
}
} int ql,qr;
int _max;
void query(int o, int l, int r) {
if (ql <= l&&r <= qr) {
//printf("(%d,%d):%d\n", l, r,maxv[o]);
_max = max(_max, maxv[o]);
}
else {
//printf("(%d,%d):%d\n", l, r, maxv[o]);
if (ql <= M) query(lson, l, M);
if (qr > M) query(rson, M + , r);
}
} int main() {
while (scanf("%d%d", &n, &m) == ) {
build(, , n);
char cmd[];
while (m--) {
scanf("%s", cmd);
if (cmd[] == 'Q') {
_max = -;
scanf("%d%d", &ql,&qr);
query(, , n);
printf("%d\n", _max);
}
else if (cmd[] == 'U') {
scanf("%d%d", &_po, &_v);
update(, , n);
}
}
}
return ;
}
05-11 11:36