【链接】[数据结构]zkw线段树

[数据结构]走近Zkw线段树(一)

[数据结构]走近Zkw线段树(二)

线段树的扩展之浅谈zkw线段树

 

#include
#define lc(x) (x<<1)
#define rc(x) (x<<1|1)
using namespace std;
const int maxn = 100005;
int max(int a, int b) { return a>b ? a : b; }

long long tr[maxn<<2];
int M, N;

void maintain(int p) { tr[p] = tr[lc(p)] + tr[rc(p)]; }

void build() {
    for(M=1; M<=N; M++);
    for(int i=M+1; i<=M+N; i++) scanf("%lld", &tr[i]);
    for(int i=M-1; i; i--) maintain(i);
}

void update(int pos, int v) {
    pos += M;
    tr[pos] += v;
    for(pos>>=1; pos; pos>>=1) maintain(pos);
}

long long RMQ(int l, int r) {
    long long ans=0;
    for(l+=M-1,r+=M+1; l^r^1; l>>=1, r>>=1) {
        if(!(l&1)) ans += tr[l^1];
        if(r&1) ans += tr[r^1];
    }
    return ans;
}

int main() {
    int m;
    scanf("%d%d", &N, &m);
    build();
    while(m--) {
        int op, i, j;
        scanf("%d%d%d", &op, &i, &j);
        if(op == 1) update(i, j);
        else printf("%lld\n", RMQ(i, j));
    }
    return 0;
}
单点更新版

你可能感兴趣的:(【链接】[数据结构]zkw线段树)