HDU 1166 敌兵布阵

线段树,单点更新求区间和

/* ***********************************************
Author        :Zhou Zhentao
Email         :774388357@qq.com
Created Time  :2015/11/20 17:21:35
File Name     :acm.cpp
************************************************ */

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;

#define lson l , m , rt << 1    
#define rson m + 1 , r , rt << 1 | 1   
#define root 1 , N , 1   
#define LL long long    
const int maxn = 50000+10;    
LL add[maxn<<2];    
LL sum[maxn<<2];    
void PushUp(int rt) {    
    sum[rt] = sum[rt<<1] + sum[rt<<1|1];    
}    
void PushDown(int rt,int m) {    
    if (add[rt]) {    
        add[rt<<1] += add[rt];    
        add[rt<<1|1] += add[rt];    
        sum[rt<<1] += add[rt] * (m - (m >> 1));    
        sum[rt<<1|1] += add[rt] * (m >> 1);    
        add[rt] = 0;    
    }    
}    
void build(int l,int r,int rt) {    
    add[rt] = 0;    
    if (l == r) {    
        scanf("%lld",&sum[rt]);    
        return ;    
    }    
    int m = (l + r) >> 1;    
    build(lson);    
    build(rson);    
    PushUp(rt);    
}    
void update(int L,int R,int c,int l,int r,int rt) {    
    if (L <= l && r <= R) {    
        add[rt] += c;    
        sum[rt] += (LL)c * (r - l + 1);    
        return ;    
    }    
    PushDown(rt , r - l + 1);    
    int m = (l + r) >> 1;    
    if (L <= m) update(L , R , c , lson);    
    if (m < R) update(L , R , c , rson);    
    PushUp(rt);    
}    
LL query(int L,int R,int l,int r,int rt) {    
    if (L <= l && r <= R) {    
        return sum[rt];    
    }    
    PushDown(rt , r - l + 1);    
    int m = (l + r) >> 1;    
    LL ret = 0;    
    if (L <= m) ret += query(L , R , lson);    
    if (m < R) ret += query(L , R , rson);    
    return ret;    
}    
int main() {    
    int N , Q,T;
    scanf("%d",&T);
    for(int Case=1;Case<=T;Case++){
        memset(add,0,sizeof add);
        memset(sum,0,sizeof sum);
        scanf("%d",&N);
        for(int i=1;i<=N;i++)
        {
            int x;
            scanf("%d",&x);
            update(i , i , x , root); 
        }

        char op[10];
        printf("Case %d:\n",Case);
        while (1) 
        {     
            int a , b , c;    
            scanf("%s",op);    
            if(strcmp(op,"End")==0) break;
            if (op[0] == 'Q') {    
                scanf("%d%d",&a,&b);    
                printf("%lld\n",query(a , b ,root));    
            } else if(op[0] == 'A'){    
                scanf("%d%d%d",&a,&c);    
                update(a , a , c , root);    
            }  
            else {
                scanf("%d%d%d",&a,&c);    
                update(a , a , -c , root); 
            }
        }    
    }
    return 0;    
}    

 

posted @ 2015-11-21 08:46  Fighting_Heart  阅读(129)  评论(0编辑  收藏  举报