維護 N (≤200,000) 名學生成績,支持 M (≤5,000) 次操作:
Q A B:查詢區間 [A,B] 最大分數
U A B:將第 A 名學生成績改為 B
struct SegTree {
vector<int> mx;
int n;
SegTree(int _n): n(_n), mx(4*_n) {}
void build(int o, int l, int r, const vector<int>& a) {
if (l == r) { mx[o] = a[l]; return; }
int mid = (l+r)/2;
build(o*2, l, mid, a);
build(o*2+1, mid+1, r, a);
mx[o] = max(mx[o*2], mx[o*2+1]);
}
void update(int o, int l, int r, int pos, int val) {
if (l == r) { mx[o] = val; return; }
int mid = (l+r)/2;
if (pos <= mid) update(o*2, l, mid, pos, val);
else update(o*2+1, mid+1, r, pos, val);
mx[o] = max(mx[o*2], mx[o*2+1]);
}
int query(int o, int l, int r, int L, int R) {
if (L <= l && r <= R) return mx[o];
int mid = (l+r)/2, res = INT_MIN;
if (L <= mid) res = max(res, query(o*2, l, mid, L, R));
if (R > mid) res = max(res, query(o*2+1, mid+1, r, L, R));
return res;
}
};
while (cin >> N >> M) 讀到 EOFQ/U 可能前有換行,用 cin >> op 自動跳過空白本題是線段樹「區間最值 + 單點更新」的標準模板題,代碼結構清晰,是後續變種題(區間加法、區間賦值等)的基礎。