1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| #include <cstdio> #include <algorithm> using namespace std;
#define LL long long #define lr rt << 1 #define rr rt << 1 | 1 #define lson l, m, rt << 1 #define rson m + 1, r, rt << 1 | 1 const int maxn = 1e5 + 7;
int N, M, n, m; LL add[maxn << 2], sum[maxn << 2];
namespace _lgl{
inline void pushup(int rt){ sum[rt] = sum[lr] + sum[rr]; }
inline void pushdown(int rt,int m){ if(add[rt]) { add[lr] += add[rt]; add[rr] += add[rt]; sum[lr] += add[rt] * (m - (m >> 1)); sum[rr] += add[rt] * (m >> 1); add[rt] = 0; } }
inline void build(int l,int r,int rt){ if(l == r){ scanf("%lld",&sum[rt]); return; } int m = (l + r) >> 1; build(lson); build(rson); pushup(rt); }
inline void update(int L, int R, int c, int l, int r, int rt){ if(L <= l && r <= R) { add[rt] += c; sum[rt] += (LL) c * (r - l + 1); return; } pushdown(rt, r - l + 1); int m = (l + r) >> 1; if(L <= m) update(L, R, c, lson); if(m < R) update(L, R, c, rson); pushup(rt); }
inline LL query(int L, int R, int l, int r, int rt){ if(L <= l && r <= R) return sum[rt]; pushdown(rt, r - l + 1); LL ret = 0; int m = (l + r) >> 1; if(L <= m) ret += query(L, R, lson); if(m < R) ret += query(L, R, rson); return ret; }
inline void main(){ scanf("%d%d",&N,&M); build(1, N, 1); while(M --){ int a, b, c, skt; scanf("%d",&skt); if(skt == 2){ scanf("%d%d",&a,&b); printf("%lld\n",query(a, b, 1, N, 1)); }else{ scanf("%d%d%d",&a,&b,&c); update(a, b, c, 1, N, 1); } } return; }
}
int main(){ _lgl::main(); return 0; }
|