线段树是一棵完全二叉树,用于高效处理区间查询和单点/区间更新操作。核心思想:把区间拆成若干段,每段维护一个聚合值(如区间和、最值)。
[1, n],左右孩子各管一半4*n 大小够用(最坏情况不超过 4n 个节点)#include <iostream>
#include <algorithm>
using namespace std;
int a[100005], tree[400005];
void build(int node, int l, int r) {
if (l == r) { tree[node] = a[l]; return; }
int mid = (l + r) / 2;
build(node*2, l, mid);
build(node*2+1, mid+1, r);
tree[node] = max(tree[node*2], tree[node*2+1]); // 改成max
}
void update(int node, int l, int r, int pos, int val) {
if (l == r) { tree[node] = val; return; }
int mid = (l + r) / 2;
if (pos <= mid) update(node*2, l, mid, pos, val);
else update(node*2+1, mid+1, r, pos, val);
tree[node] = max(tree[node*2], tree[node*2+1]);
}
int query(int node, int l, int r, int ql, int qr) {
if (ql <= l && r <= qr) return tree[node];
int mid = (l + r) / 2, res = -1e9;
if (ql <= mid) res = max(res, query(node*2, l, mid, ql, qr));
if (qr > mid) res = max(res, query(node*2+1, mid+1, r, ql, qr));
return res;
}
ql<=l && r<=qr,不是反过来