hdu 1166 敌兵布阵 线段树单点更新

来源:互联网 发布:java sftp 编辑:程序博客网 时间:2024/06/05 08:46

全部采用扩展区间

//328MS1292K#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>#define lch(x) ((x)<<1)#define rch(x) ((x)<<1 | 1)using namespace std;const int MAX_N = 50000;int tree[MAX_N<<2];int a[MAX_N + 5];int N, NN;void init_NN(){    NN = 1;    while(NN < N) NN <<= 1;}inline void push_up(int n){    tree[n] = tree[lch(n)] + tree[rch(n)];}void build(int n, int l, int r){    if(l == r){        tree[n] = a[l];        return;    }    int mid = (l+r)>>1;    build(lch(n), l, mid);    build(rch(n), mid+1, r);    push_up(n);}void modify(int pos, int v){    int now = NN - 1 + pos;    while(now >= 1){        tree[now] += v;        now >>= 1;    }}/*void modify(int pos, int v, int n, int l, int r){    tree[n] += v;    if(l == r){        return;    }    int mid = (l+r)>>1;    if(pos <= mid){       modify(pos, v, lch(n), l, mid);    }    else if(mid+1 <= pos){        modify(pos, v, rch(n), mid+1, r);    }}*/int query(int a, int b, int n, int l, int r){    if(a <= l && r <= b){        return tree[n];    }    int res = 0;    int mid = (l+r)>>1;    if(mid+1 <= a) res += query(a, b, rch(n), mid+1, r);    else if(b <= mid) res += query(a, b, lch(n), l, mid);    else res += query(a, b, rch(n), mid+1, r) + query(a, b, lch(n), l, mid);    return res;}int main(){    int T; scanf("%d", &T);    for(int kase=1; kase<=T; kase++){        memset(tree, 0, sizeof(tree));        memset(a, 0, sizeof(a));        scanf("%d", &N);        for(int i=1; i<=N; i++)            scanf("%d", &a[i]);        init_NN();        build(1, 1, NN);        char str[10];        printf("Case %d:\n", kase);        while(true){            scanf("%s", str);            if(strcmp(str, "End") == 0) break;            int a, b;            scanf("%d%d", &a, &b);            if(strcmp(str, "Add") == 0){                modify(a, b);            }            else if(strcmp(str, "Sub") == 0){                modify(a, -b);            }            else if(strcmp(str, "Query") == 0){                printf("%d\n", query(a, b, 1, 1, NN));            }        }    }    return 0;}


0 0