struct SegmentTree {
    int n;
    vector<ll> t;

    SegmentTree(int n_, const vector<int> &init) {
        n = n_;
        t.assign(n * 4 + 1, 0);
        build(1, 1, n, init);
    }

    void push_up(int u) {
        t[u] = t[u * 2] + t[u * 2 + 1];
    }

    void build(int u, int ul, int ur, const vector<int> &init) {
        if (ul == ur) {
            t[u] = init[ul];
            return;
        }
        int mid = ul + ur >> 1;
        build(u * 2, ul, mid, init);
        build(u * 2 + 1, mid + 1, ur, init);
        push_up(u);
    }

    ll query(int u, int ul, int ur, int l, int r) {
        if (l <= ul && ur <= r) return t[u];
        if (ur < l || r < ul) return 0;
        int mid = ul + ur >> 1;
        return query(u * 2, ul, mid, l, r) + query(u * 2 + 1, mid + 1, ur, l, r);
    }

    ll query(int l, int r) {
        return query(1, 1, n, l, r);
    }

    void change(int u, int ul, int ur, int x, ll y) {
        if (ul == ur) {
            t[u] += y;
            return;
        }
        int mid = ul + ur >> 1;
        if (x <= mid) change(u * 2, ul, mid, x, y);
        else change(u * 2 + 1, mid + 1, ur, x, y);
        push_up(u);
    }
    void change(int x, ll y) {
        change(1, 1, n, x, y);
    }
};
void solve() {
    int n, m;
    cin >> n >> m;

    vector<int> a(n + 1);
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }

    SegmentTree t(n, a);
    while (m--) {
        ll o, x, y;
        cin >> o >> x >> y;
        if (o == 1) t.change(x, y);
        else cout << t.query(x, y) << '\n';
    }
}

0 条评论

目前还没有评论...

信息

ID
429
时间
ms
内存
MiB
难度
3
标签
递交数
53
已通过
15
上传者