Advanced Data Structures :: Segment Tree
Description
老师喜欢问,某某、某某到某某某中,分数最高的是谁。
并且有时候弄错成绩了要改成绩。
输入所有学生初始的成绩,和一些操作,操作包括改成绩和问成绩。
对所有问成绩的操作,输出询问的结果。
Type
Advanced Data Structures :: Segment Tree
Analysis
经典线段树的题目,用到了线段树区间求最值的能力,只需要单点更新。
Solution
// HDOJ 1754 // I Hate It // by A Code Rabbit #include <algorithm> #include <cstdio> using namespace std; #define LSon(x) (x << 1) #define RSon(x) (x << 1 | 1) const int MAXN = 200002; const int ROOT = 1; struct Seg{ int w; }; struct SegTree { Seg node[MAXN << 2]; void Update(int pos) { node[pos].w = max(node[LSon(pos)].w, node[RSon(pos)].w); } void Build(int l, int r, int pos) { if (l == r) { scanf("%d", &node[pos].w); return; } int m = l + r >> 1; Build(l, m, LSon(pos)); Build(m + 1, r, RSon(pos)); Update(pos); } void Modify(int l, int r, int pos, int x, int y) { if (l == r) { node[pos].w = y; return; } int m = l + r >> 1; if (x <= m) Modify(l, m, LSon(pos), x, y); else Modify(m + 1, r, RSon(pos), x, y); Update(pos); } int Query(int l, int r, int pos, int x, int y) { if (x <= l && r <= y) return node[pos].w; int m = l + r >> 1; int res = 0; if (x <= m) res = max(Query(l, m, LSon(pos), x, y), res); if (y > m) res = max(Query(m + 1, r, RSon(pos), x, y), res); return res; } }; int n, m; char c; int a, b; SegTree tree; int main() { while (scanf("%d%d", &n, &m) != EOF) { tree.Build(1, n, ROOT); for (int i = 0; i < m; ++i) { getchar(); scanf("%c%d%d", &c, &a, &b); if (c == 'Q') printf("%d\n", tree.Query(1, n, ROOT, a, b)); else if (c == 'U') tree.Modify(1, n, ROOT, a, b); } } return 0; }