帮我写一段线段树代码
时间: 2023-07-10 13:15:17 浏览: 90
算法文档无代码线段树与矩形切割
好的,以下是一个简单的线段树模板代码,用来求区间和:
```c++
const int MAXN = 1e6;
int a[MAXN];
int sum[MAXN << 2];
void build(int l, int r, int rt) {
if (l == r) {
sum[rt] = a[l];
return;
}
int mid = (l + r) >> 1;
build(l, mid, rt << 1);
build(mid + 1, r, rt << 1 | 1);
sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
}
void update(int p, int val, int l, int r, int rt) {
if (l == r) {
sum[rt] += val;
return;
}
int mid = (l + r) >> 1;
if (p <= mid) update(p, val, l, mid, rt << 1);
else update(p, val, mid + 1, r, rt << 1 | 1);
sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
}
int query(int L, int R, int l, int r, int rt) {
if (L <= l && r <= R) {
return sum[rt];
}
int mid = (l + r) >> 1;
int ans = 0;
if (L <= mid) ans += query(L, R, l, mid, rt << 1);
if (mid < R) ans += query(L, R, mid + 1, r, rt << 1 | 1);
return ans;
}
```
这段代码实现了一个简单的线段树,包括了建树、单点修改、区间查询三个基本操作。
阅读全文