区间内每一个数加一个数。
板子,记录一下。
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 }