线段树区间修改

区间内每一个数加一个数。

板子,记录一下。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cmath>
 5 #include<cstring>
 6 using namespace std;
 7 typedef long long ll;
 8 const int maxn = 1e5 + 5;
 9 int l[maxn << 2], r[maxn << 2], sum[maxn << 2], lazy[maxn << 3];
10 void build(int L, int R, int now)
11 {
12     l[now] = L; r[now] = R;
13     if(L == R) 
14     {
15         int x; scanf("%lld", &x);
16         sum[now] = x; return;
17     }
18     int mid = (L + R) >> 1;
19     build(L, mid, now << 1);
20     build(mid + 1, R, now << 1 | 1);
21     sum[now] = sum[now << 1] + sum[now << 1 | 1];
22 }
23 void pushdown(int now)
24 {
25     if(lazy[now])
26     {
27         sum[now] += lazy[now] * (r[now] - l[now] + 1);
28         lazy[now << 1] += lazy[now];
29         lazy[now << 1 | 1] += lazy[now];
30         lazy[now] = 0;
31     }
32 }
33 void update(int L, int R, int x, int now)
34 {
35     if(L == l[now] && R == r[now])
36     {
37         lazy[now] += x; return;
38     }
39     sum[now] += (ll)x * (R - L + 1);
40     int mid = (l[now] + r[now]) >> 1;
41     if(R <= mid) update(L, R, x, now << 1);
42     else if(L > mid) update(L, R, x, now << 1 | 1);
43     else {update(L, mid, x, now << 1); update(mid + 1, R, x, now << 1 | 1);}
44 }
45 ll query(int L, int R, int now)
46 {
47     pushdown(now);
48     if(L == l[now] && R == r[now]) return sum[now];    
49     int mid = (l[now] + r[now]) >> 1;
50     if(R <= mid) return query(L, R, now << 1);
51     else if(L > mid) return query(L, R, now << 1 | 1);
52     else return query(L, mid, now << 1) + query(mid + 1, R, now << 1 | 1);
53 }
54 int n, m;
55 int main()
56 {
57     scanf("%d%d", &n, &m);
58     build(1, n, 1);
59     for(int i = 1; i <= m; ++i)
60     {
61         int o; scanf("%d", &o);
62         if(o == 1) 
63         {
64             int a, b, c; scanf("%d%d%d", &a, &b, &c);
65             update(a, b, c, 1);
66         }
67         else
68         {
69             int a, b; scanf("%d%d", &a, &b);
70             printf("%lld\n", query(a, b, 1));
71         }
72     }
73     return 0;
74 }

猜你喜欢

转载自www.cnblogs.com/mrclr/p/9028134.html