线段树求和(求助)
查看原帖
线段树求和(求助)
590609
jiangjiangQwQ楼主2023/4/14 21:02
#include<iostream>

using namespace std;
#define int long long
#define rep(i, l, r) for (register int i = l; i <= r; i++)
template < typename T > void read(T & ff) {
    T rr = 1;
    ff = 0;
    char ch = getchar();
    while (!isdigit(ch)) {
        if (ch == '-') rr = -1;
        ch = getchar();
    }
    while (isdigit(ch)) {
        ff = (ff << 1) + (ff << 3) + (ch ^ 48);
        ch = getchar();
    }
    ff *= rr;
}
#define il inline
const int N = 2e6;
int n, a[N];
struct node {
    int l, r, sum;
}
t[N << 2];
il int ls(int x) { return x << 1; }
il int rs(int x) { return x << 1 | 1; }
void build(int c, int l, int r) {
    t[c].l = l;
    t[c].r = r;
    if (l == r) {
        t[c].sum = a[l];
        return;
    }
    int mid = (l + r) / 2;
    build(ls(c), l, mid);
    build(rs(c), mid + 1, r);
    t[c].sum = t[ls(c)].sum + t[rs(c)].sum;
    return;
}
void update(int c, int l, int r) {
    if (t[c].l == t[c].r) {
        t[c].sum = r;
        return;
    }
    int mid = (t[c].l + t[c].r) / 2;
    if (r <= mid) update(ls(c), l, r);
    else update(rs(c), l, r);
    t[c].sum = t[ls(c)].sum + t[rs(c)].sum;
    return;
}
int query(int c, int l, int r) {
    if (t[c].l == l && t[c].r == r) return t[c].sum;
    int mid = (t[c].r + t[c].l) / 2;
    if (r <= mid) return query(ls(c), l, r);
    else if (l > mid) return query(rs(c), l, r);
    else {
        int t1 = query(ls(c), l, mid);
        int t2 = query(rs(c), mid + 1, r);
        return t1 + t2;
    }
}
signed main() {
    read(n);
    rep(i, 1, n) {
        read(a[i]);
    }
    build(1, 1, n);
    int q;
    read(q);
    while (q--) {
        int op, L, R;
        read(op);
        read(L);
        read(R);
        if (op == 1) { printf("%lld\n", query(1, L, R)); } //
        else update(1, L, R);
    }
    return 0;
}

找不出哪错(;´д`)ゞ

2023/4/14 21:02
加载中...