线段树的点更新已经算是入门了,接下来还有区间更新,好像涉及个lazy操作什么的
#include <bits/stdc++.h> using namespace std; const int N = 200000; struct Segtree{ int l, r, n; }segtree[N * 4]; void build(int k, int l, int r){ segtree[k] = {l, r, 0}; if(l == r) return ; int mid = (l + r) / 2; build(2 * k, l, mid); build(2 * k + 1, mid + 1, r); } void insert(int k, int id, int n){ if(segtree[k]. l == segtree[k]. r && segtree[k]. l == id){ segtree[k]. n = n; return ; } int mid = (segtree[k]. l + segtree[k]. r) / 2; if(id <= mid) insert(2 * k, id, n); else insert(2 * k + 1, id, n); segtree[k]. n = max(segtree[2 * k]. n, segtree[2 * k + 1]. n); } int query(int k, int l, int r){ if(segtree[k]. l == l && segtree[k]. r == r){ return segtree[k]. n; } int mid = (segtree[k]. l + segtree[k]. r) / 2; if(r <= mid) return query(2 * k, l, r); else if(l > mid) return query(2 * k + 1, l, r); else return max(query(2 * k, l, mid), query(2 * k + 1, mid + 1, r)); } int main() { char ch; int x, y, k; int n, m; while(scanf("%d%d", &n, &m) == 2){ build(1, 1, n); for(int i = 1; i <= n; i ++){ scanf("%d", &k); insert(1, i, k); } while(m --) { getchar(); scanf("%c%d%d", &ch, &x, &y); if(ch == 'U'){ insert(1, x, y); } else if(ch == 'Q'){ printf("%d\n", query(1, x, y)); } } } return 0; }