超级传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1754
分析:用线段树来保存学生成绩,每次更新区间最大值即可。
代码:
#include<cstdio>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
const int maxn = 200000;
char cmd[2];
int n, mNum, a, b, max[maxn<<2];
int Max(int x, int y) {
return (x>y ? x:y);
}
void PushUp(int rt) {
max[rt] = Max(max[rt<<1], max[rt<<1|1]);
}
void BuildTree(int l, int r, int rt) {
if (l == r) {
scanf("%d", &max[rt]);
return ;
}
int m = (l+r)>>1;
BuildTree(lson);
BuildTree(rson);
PushUp(rt);
}
int Query(int L, int R, int l, int r, int rt) {
if (L<=l && r<=R)
return max[rt];
int ret=-1,m=(l+r)>>1;
if (L <= m)
ret = Max(ret, Query(L, R, lson));
if (R > m)
ret = Max(ret, Query(L, R, rson));
return ret;
}
void UpDate(int p, int bi, int l, int r, int rt) {
if (l == r) {
max[rt] = bi;
return ;
}
int m = (l+r)>>1;
if (p <= m)
UpDate(p, bi, lson);
else
UpDate(p, bi, rson);
PushUp(rt);
}
int main() {
#ifndef ONLINE_JUDGE
freopen("1.txt","r",stdin);
#endif
while (scanf("%d %d", &n, &mNum)>0) {
BuildTree(1, n, 1);
for (int i=1; i<=mNum; ++i) {
scanf("%s%d%d", cmd, &a, &b);
if (cmd[0] == 'Q')
printf("%d\n", Query(a, b, 1, n, 1));
else
UpDate(a, b, 1, n, 1);
}
}
return 0;
}