CODEVS1082 线段树练习3

Update 区间修改

Query 区间询问

 1 #include <cstdio>
 2 
 3 #define maxn 200008
 4 #define lson l , m , rt << 1
 5 #define rson m+1 , r , rt << 1 | 1
 6 long long sum[maxn << 2],lazy[maxn << 2];
 7 int n;
 8 
 9 void Pushup(int rt){
10     sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
11 }
12 
13 void Pushdown(int rt,int m){
14     if (lazy[rt]) {
15         lazy[rt << 1] += lazy[rt];
16         lazy[rt << 1 | 1] += lazy[rt];
17         sum[rt << 1] += lazy[rt] * (m - m / 2);
18         sum[rt << 1 | 1] += lazy[rt] * (m / 2);
19         lazy[rt] = 0;
20     }
21 }
22 
23 void Build(int l,int r,int rt){
24     lazy[rt] = 0;
25     if (l==r) {
26         scanf("%d",&sum[rt]);
27         return;
28     }
29     int m = (l + r) >> 1;
30     Build(lson);
31     Build(rson);
32     Pushup(rt);
33 }
34 
35 void Update(int L,int R,int val,int l,int r,int rt){
36     if (L <= l && r <= R) {
37         sum[rt] += (r - l + 1) * val;
38         lazy[rt] += val;
39         return;
40     }
41     Pushdown(rt,r - l + 1);
42     int m = (l + r) >> 1;
43     if (L <= m) Update(L,R,val,lson);
44     if (m <  R) Update(L,R,val,rson);
45     Pushup(rt);
46 }
47 
48 long long Query(int L,int R,int l,int r,int rt){
49     if (L <= l && r <= R) {
50         return sum[rt];
51     }
52     Pushdown(rt,r - l + 1);
53     int m = (l + r) >> 1;
54     long long res = 0;
55     if (L <= m) res += Query(L,R,lson);
56     if (m <  R) res += Query(L,R,rson);
57     return res;
58 }
59 
60 int main() {
61     scanf("%d",&n);
62     Build(1,n,1);
63     int Q;
64     scanf("%d",&Q);
65     while (Q--) {
66         int x,y,z,w;
67         scanf("%d",&w);
68         if (w==1) {
69             scanf("%d%d%d",&x,&y,&z);
70             Update(x,y,z,1,n,1);
71         }
72         else {    
73             scanf("%d%d",&x,&y);
74             printf("%I64d\n",Query(x,y,1,n,1));                
75         }
76     }
77 }

 

posted @ 2015-01-06 20:48  rpSebastian  阅读(173)  评论(0)    收藏  举报