超级传送门: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; }