生成一个c++线段树程序
时间: 2023-04-10 11:05:18 浏览: 99
非常感谢您的提问,我可以回答您的问题。以下是一个简单的 C 语言线段树程序的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100005
int n, m;
int 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 m = (l + r) >> 1;
build(l, m, rt << 1);
build(m + 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 m = (l + r) >> 1;
pushdown(rt, m - l + 1, r - m);
if (L <= m) update(L, R, c, l, m, rt << 1);
if (R > m) update(L, R, c, m + 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 m = (l + r) >> 1, ret = 0;
pushdown(rt, m - l + 1, r - m);
if (L <= m) ret += query(L, R, l, m, rt << 1);
if (R > m) ret += query(L, R, m + 1, r, rt << 1 | 1);
return ret;
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
build(1, n, 1);
for (int i = 1; i <= m; i++) {
int op, x, y, k;
scanf("%d", &op);
if (op == 1) {
scanf("%d%d%d", &x, &y, &k);
update(x, y, k, 1, n, 1);
} else {
scanf("%d%d", &x, &y);
printf("%d\n", query(x, y, 1, n, 1));
}
}
return 0;
}
```
希望这个代码对您有所帮助!
阅读全文