线段树模板

 

区间修改,区间查询,求和

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 const int maxn = 1e6+6;
 7 #define LL long long
 8 #define INF 0x7fffffff
 9 
10 int n,q,a[maxn];
11 
12 struct node{
13     int l, r;
14     LL sum, lazy;
15     void update(int x) {
16         sum += 1LL*(r-l+1)*x; // 防止爆int
17         lazy += x;
18     }
19 }tree[maxn*4];
20 
21 void push_up(int x) {
22     tree[x].sum = tree[x<<1].sum + tree[x<<1|1].sum;
23 }
24 
25 void push_down(int x) {
26     int lazy = tree[x].lazy;
27     if(lazy) {
28         tree[x<<1].update(lazy);
29         tree[x<<1|1].update(lazy);
30         tree[x].lazy = 0;
31     }
32 }
33 
34 void build(int x, int l, int r) {
35     tree[x].l = l, tree[x].r = r;
36     tree[x].sum = tree[x].lazy = 0;
37     if(l == r) {
38         tree[x].sum = a[l];
39     }
40     else {
41         int mid = (l+r) / 2;
42         build(x<<1, l, mid);
43         build(x<<1|1, mid+1, r);
44         push_up(x);
45     }
46 }
47 
48 void update(int x, int l, int r, int val) {
49     int L = tree[x].l, R = tree[x].r;
50     if(l <= L && R <= r) {
51         tree[x].update(val);
52     }
53     else {
54         push_down(x);
55         int mid = (L+R) / 2;
56         if(mid >= l) update(x<<1, l, r, val);
57         if(r > mid) update(x<<1|1, l, r, val);
58         push_up(x);
59     }
60 }
61 
62 LL query(int x, int l, int r) {
63     int L = tree[x].l, R = tree[x].r;
64     if(l <= L && R <= r) return tree[x].sum;
65     else {
66         push_down(x);
67         int mid = (L+R) / 2;
68         LL ans = 0;
69         if(mid >= l) ans += query(x<<1, l, r);
70         if(r > mid) ans += query(x<<1|1, l, r);
71         push_up(x);
72         return ans;
73     }
74 }
75 
76 
77 int main() {
78     scanf("%d",&n);
79     for(int i=1;i<=n;i++)a[i]=0;
80     build(1,1,n);
81     scanf("%d",&q);
82     for(int i=1;i<=q;i++)
83     {
84         int o,l,r,val;
85         scanf("%d%d%d%d",&o,&l,&r,&val);
86         if(o==0)update(1,l,r,val);
87         else printf("%lld\n",query(1,l,r));
88     }
89     return 0;
90 }

 

posted @ 2018-05-05 17:32  demianzhang  阅读(199)  评论(0编辑  收藏  举报