写一段关于非递归线段树的代码
时间: 2023-05-12 16:03:39 浏览: 77
线段树代码
以下是关于非递归线段树的代码:
```cpp
const int MAXN = 1e5 + 5;
int n, m, a[MAXN], sum[MAXN << 2], add[MAXN << 2];
void pushup(int rt) {
sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
}
void pushdown(int rt, int ln, int rn) {
if (add[rt]) {
add[rt << 1] += add[rt];
add[rt << 1 | 1] += add[rt];
sum[rt << 1] += add[rt] * ln;
sum[rt << 1 | 1] += add[rt] * rn;
add[rt] = 0;
}
}
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);
pushup(rt);
}
void update(int L, int R, int c, int l, int r, int rt) {
if (L <= l && r <= R) {
add[rt] += c;
sum[rt] += c * (r - l + 1);
return;
}
int mid = (l + r) >> 1;
pushdown(rt, mid - l + 1, r - mid);
if (L <= mid) update(L, R, c, l, mid, rt << 1);
if (R > mid) update(L, R, c, mid + 1, r, rt << 1 | 1);
pushup(rt);
}
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, res = 0;
pushdown(rt, mid - l + 1, r - mid);
if (L <= mid) res += query(L, R, l, mid, rt << 1);
if (R > mid) res += query(L, R, mid + 1, r, rt << 1 | 1);
return res;
}
```
这是一个基本的非递归线段树模板,包括建树、区间修改、区间查询等操作。
阅读全文