以下是一个简单的线段树实现,用于区间求和:

#include <iostream>
using namespace std;

const int MAXN = 100005;
int n, m;
int a[MAXN];  // 存储原数组
int t[MAXN << 2];  // 线段树节点

void build(int p, int l, int r) {
    if (l == r) {
        t[p] = a[l];
        return;
    }
    int mid = (l + r) >> 1;
    build(p << 1, l, mid);
    build(p << 1 | 1, mid + 1, r);
    t[p] = t[p << 1] + t[p << 1 | 1];
}

int query(int p, int l, int r, int ql, int qr) {
    if (ql > r || qr < l) {
        return 0;
    }
    if (ql <= l && r <= qr) {
        return t[p];
    }
    int mid = (l + r) >> 1;
    return query(p << 1, l, mid, ql, qr) + query(p << 1 | 1, mid + 1, r, ql, qr);
}

void modify(int p, int l, int r, int pos, int val) {
    if (l == r) {
        t[p] = val;
        return;
    }
    int mid = (l + r) >> 1;
    if (pos <= mid) {
        modify(p << 1, l, mid, pos, val);
    } else {
        modify(p << 1 | 1, mid + 1, r, pos, val);
    }
    t[p] = t[p << 1] + t[p << 1 | 1];
}

int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    build(1, 1, n);
    while (m--) {
        int op, x, y;
        cin >> op >> x >> y;
        if (op == 1) {
            modify(1, 1, n, x, y);
        } else {
            cout << query(1, 1, n, x, y) << endl;
        }
    }
    return 0;
}

该代码实现了线段树的三个基本操作:建树、区间查询和单点修改。其中,建树操作通过递归实现,查询和修改操作则通过递归地访问线段树中的节点实现。

可以向我展示一份线段树的代码吗

原文地址: https://www.cveoy.top/t/topic/b0JD 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录