满江紫求助
查看原帖
满江紫求助
746237
SaintRelief楼主2023/12/20 22:27
#include <bits/stdc++.h>

const int INF = 2147483647;
const int NINF = -2147483648;
const int Mod = 998244353;
const int N = 1e6 + 10;

typedef long long ll;

using namespace std;

int n, m;
int a[N];

struct Node {
    int l, r;
    int v;
    int sum, add;
} tree[N << 2];

void pushup(int root) {
    tree[root].v = tree[root << 1].v + tree[root << 1 | 1].v;
}

int pushdown(int root) {
    // Do somesthing
}

void build(int root, int l, int r) {
    tree[root].l = l;
    tree[root].r = r;
    if (l == r) {
        tree[root].v = a[l];
        return;
    }
    int mid = (l + r) >> 1;
    build(root << 1, l, mid);
    build(root << 1 | 1, mid + 1, r);
    pushup(root);
} // Build tree

void upd(int root, int p, int v) {
    int l = tree[root].l, r = tree[root].r;
    if (l == r) {
        tree[root].v += v;
        return;
    }
    int mid = (l + r) >> 1;
    if (p <= mid)
        upd(root << 1, p, v);
    if (p > mid)
        upd(root << 1 | 1, p, v);
    pushup(root);
} // up data

Node query(int root, int sp, int ep) {
    int l = tree[root].l, r = tree[root].r;
    if (l >= sp && r <= ep)
        return tree[root];
    int mid = (l + r) >> 1;
    if (ep <= mid)
        query(root << 1, sp, ep);
    if (sp > mid)
        query(root << 1 | 1, sp, ep);
    auto L = query(root << 1, sp, ep);
    auto R = query(root << 1 | 1, sp, ep);
    Node res;
    res.l = L.l;
    res.r = L.r;
    res.v = L.v + R.v;
    return res;
} // query tree

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

    build(1, 1, n);

    while (m--) {
        int op, l, r;
        cin >> op >> l >> r;
        if (op == 1)
            upd(1, l, r);
        else {
            auto res = query(1, l, r);// query错了,但不知那错了
            cout << res.v << '\n';
        }
    }
    return 0;
}

2023/12/20 22:27
加载中...