POJ 3468 A Simple Problem with Integers 线段树
题目链接:
poj: http://poj.org/problem?id=3468
题意:
成段更新,成段查询。
代码:
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #define LSON o<<1 6 #define RSON (o<<1)+1 7 #define M l+(r-l)/2 8 using namespace std; 9 10 typedef long long LL; 11 const int maxn = (100000 << 2) + 10; 12 13 int _n, _q; 14 LL _sumv[maxn],_addv[maxn]; 15 //bool tag[maxn]; 16 17 void pushdown(int o, int l, int r){ 18 if (r > l){ 19 _addv[LSON] += _addv[o]; 20 _addv[RSON] += _addv[o]; 21 _addv[o] = 0; 22 } 23 } 24 25 void maintain(int o, int l, int r){ 26 _sumv[o] = 0; 27 if (r > l){ 28 _sumv[o] = _sumv[LSON] + _sumv[RSON]; 29 } 30 _sumv[o] += _addv[o] * (r - l + 1); 31 } 32 33 void build(int o, int l, int r){ 34 if (l == r){ 35 scanf("%lld", _addv + o); 36 } 37 else{ 38 build(LSON, l, M); 39 build(RSON, M + 1, r); 40 } 41 maintain(o, l, r); 42 } 43 44 int _ul, _ur, _v; 45 void update(int o, int l, int r){ 46 if (_ul <= l&&r <= _ur){ 47 _addv[o] += _v; 48 } 49 else{ 50 pushdown(o, l, r); 51 if (_ul <= M) update(LSON, l, M); else maintain(LSON, l, M); 52 if (_ur > M) update(RSON, M + 1, r); else maintain(RSON, M + 1, r); 53 } 54 maintain(o, l, r); 55 } 56 57 int _ql, _qr; 58 LL _sum; 59 void query(int o, int l, int r){ 60 if (_ql <= l&&r <= _qr){ 61 _sum += _sumv[o]; 62 } 63 else{ 64 pushdown(o, l, r); 65 maintain(LSON, l, M); 66 maintain(RSON, M + 1, r); 67 if (_ql <= M) query(LSON, l, M); 68 if (_qr > M) query(RSON, M + 1, r); 69 } 70 } 71 72 73 void init(){ 74 memset(_addv, 0, sizeof(_addv)); 75 } 76 77 int main(){ 78 while (scanf("%d%d", &_n, &_q) == 2 && _n){ 79 init(); 80 build(1, 1, _n); 81 char cmd[2]; 82 while (_q--){ 83 scanf("%s", cmd); 84 if (cmd[0] == 'Q'){ 85 _sum = 0; 86 scanf("%d%d", &_ql, &_qr); 87 query(1, 1, _n); 88 printf("%lld\n", _sum); 89 } 90 else{ 91 scanf("%d%d%d", &_ul, &_ur, &_v); 92 update(1, 1, _n); 93 } 94 } 95 } 96 return 0; 97 }