题意:老师询问被编号为1~n的学生中的某个区间内学生的最高分。
老师也可以更新某个学生的分数。
#include <iostream> #include <cstdio> using namespace std; #define N 200005 #define M 2005 int maxsc[N << 2]; //存储区间内的最高分数。 inline int MAX(int a, int b) { return a > b ? a : b; } void pushUp(int rt) { maxsc[rt] = MAX(maxsc[rt << 1], maxsc[rt << 1 | 1]); } void build(int l, int r, int rt) { if (l == r) { scanf ("%d", &maxsc[rt]); return; } int m = (l + r) >> 1; build (l, m, rt << 1); build (m + 1, r, rt << 1 | 1); pushUp(rt); } void update(int l, int r, int rt, int id, int sc) { if (l == r) { maxsc[rt] = sc; return; } int m = (l + r) >> 1; if (m >= id) update(l, m, rt << 1, id, sc); else update(m + 1, r, rt << 1 | 1, id, sc); pushUp(rt); } int query(int l, int r, int rt, int L, int R) { if (l >= L && r <= R) return maxsc[rt]; int m = (l + r) >> 1, tmp = 0; //必须初始化 if (m >= L) tmp = query(l, m, rt << 1, L, R); if (m < R) tmp = MAX(tmp, query(m + 1, r, rt << 1 | 1, L, R)); return tmp; //当上面的两个if不成立,返回0 } int main() { int n, m; while(scanf ("%d %d", &n, &m) != EOF) { build(1, n, 1); char ch; int a, b; while (m--) { scanf ("\n%c %d %d", &ch, &a, &b); if (ch == 'U') update(1, n, 1, a, b); else printf ("%d\n", query(1, n, 1, a, b)); } } return 0; }