线段树模板整理

  1 #include<cstdlib>
  2 #include<cstdio>
  3 #include<cmath>
  4 #include<cstring>
  5 #include<string>
  6 #include<iostream>
  7 #include<algorithm>
  8 #include<map>
  9 #include<queue>
 10 #include<vector>
 11 using namespace std;
 12 typedef long long LL;
 13 const LL MaxN = 1e5;
 14 typedef struct{
 15     int l, r;
 16     LL sum, lazy;
 17     void update(LL C)
 18     {
 19         sum += 1LL*(r-l+1)*C;
 20         lazy += C;
 21     }
 22 } Power;
 23 Power segtree[MaxN<<2];
 24 int n, q;
 25 int num[MaxN+5];
 26 
 27 void push_up(int x)
 28 {
 29     segtree[x].sum = segtree[x<<1].sum + segtree[x<<1|1].sum;
 30 }
 31 void push_down(int x)
 32 {
 33     int lazyval = segtree[x].lazy;
 34     if(lazyval){
 35         segtree[x<<1].update(lazyval);
 36         segtree[x<<1|1].update(lazyval);
 37         segtree[x].lazy = 0;
 38     }
 39 }
 40 
 41 //建树
 42 void Build(int x, int l, int r)
 43 {
 44     segtree[x].l = l, segtree[x].r = r;
 45     segtree[x].sum = segtree[x].lazy = 0;
 46     if(l == r){
 47         segtree[x].sum = num[x];
 48         return;
 49     }
 50     int mid = (l + r)/2;
 51     Build(x<<1, l, mid);
 52     Build(x<<1|1, mid+1, r);
 53     push_up(x);
 54 }
 55 
 56 //点修改,假设num[i]+C
 57 void Update_point(int x, int i, int C)
 58 {
 59     int l = segtree[x].l, r = segtree[x].r;
 60     if(l == r){
 61         segtree[x].sum += C;
 62         return;
 63     }
 64     int mid = (l+r)/2;
 65     if(i <= mid) Update_point(x<<1, i, C);
 66     else Update_point(x<<1|1, i, C);
 67     push_up(x);
 68 }
 69 
 70 //区间修改,假设num[L, R] += C
 71 void Update_segment(int x, int L, int R, LL C)
 72 {
 73     int l = segtree[x].l, r = segtree[x].r;
 74     if(l >= L && r <= R){
 75         segtree[x].update(C);
 76     }
 77     else{
 78         push_down(x);
 79         int mid = (l + r)/2;
 80         if(mid >= L) Update_segment(x<<1, L, R, C);
 81         if(mid < R) Update_segment(x<<1|1, L, R, C);
 82         push_up(x);
 83     }
 84 }
 85 
 86 //区间查询,假设查询num[L, R];
 87 LL Query_segment(int x, int L, int R)
 88 {
 89     int l = segtree[x].l, r = segtree[x].r;
 90     if(l >= L && r <= R){
 91         return segtree[x].sum;
 92     }
 93     else{
 94         push_down(x);
 95         LL ans = 0;
 96         int mid = (l + r)/2;
 97         if(mid >= L) ans += Query_segment(x<<1, L, R);
 98         if(mid < R) ans += Query_segment(x<<1|1, L, R);
 99         push_up(x);
100         return ans;
101     }
102 }
103 
104 int main()
105 {
106     cin >> n;
107     for(int i = 1;i <= n;i++){
108         scanf("%d", num + i);
109     }
110     Build(1, 1, n);
111     scanf("%d", &q);
112     for(int i = 1;i <= q;i++){
113         int l, r, C;
114         scanf("%d %d %d", &l, &r, &C);
115         Update_segment(1, l, r, C);
116         printf("%lld\n", Query_segment(1, l, r));
117     }
118     return 0;
119 }

猜你喜欢

转载自www.cnblogs.com/ScaleCX/p/9400582.html