记录一下zkw线段树

来源:互联网 发布:淘宝刷到单流程图 编辑:程序博客网 时间:2024/06/05 09:08

    今天重新学习了一下ZKW线段树,非递归版的线段树。学完之后就是突出一个美丽新世界。

     在这里用敌兵布阵测试,并记录一下方便以后复习。


     

#include<bits/stdc++.h>using namespace std;const int maxn = 50005;int n, N;int arr[maxn];int Sum[maxn<<2];void build(int n){    memset(Sum, 0, sizeof(Sum));    N = 1;    while(N < n+2) N <<= 1;    for (int i = 1; i <= n; i++)        Sum[N+i] += arr[i];    for (int i = N-1; i > 0; i--)        Sum[i] = Sum[i<<1] + Sum[i<<1|1];}void update(int L, int C){    for (int i = L+N; i > 0; i >>= 1)        Sum[i] += C;}int query(int L, int R){    int ans = 0;    int s, t;    for (s = L+N-1, t = R+N+1; s^t^1; s >>= 1, t >>= 1){        if (~s&1) ans += Sum[s^1];        if (t&1) ans += Sum[t^1];    }    return ans;}int main(){    std::ios::sync_with_stdio(false);    int T;    cin >> T;    for (int kase = 1; kase <= T; kase++){        cin >> n;        for (int i = 1; i <= n; i++)            cin >> arr[i];        build(n);        cout << "Case " << kase << ":" << endl;        string opt;        while(cin >> opt){            if (opt[0] == 'E') break;            int s, t;            cin >> s >> t;            if (opt[0] == 'A') update(s, t);            if (opt[0] == 'S') update(s, -t);            if (opt[0] == 'Q') cout << query(s, t) << endl;        }    }    return 0;}