1 #include<bits/stdc++.h> 2 using namespace std; 3 const int MAX = 100005; 4 typedef struct Node{ 5 long long val, tag; 6 int l, r; 7 Node *rson, *lson; 8 int len() {return r - l;} 9 int mid() {return (l + r) >> 1;} 10 Node(): rson(NULL), lson(NULL), l(0), r(0), val(0), tag(0){} 11 }node, *pointer; 12 13 class Segment_Tree 14 { 15 public: 16 pointer rt = new Node(); 17 long long a[MAX]; 18 19 void PushUp(pointer rt) 20 { 21 rt->val = rt->rson->val + rt->lson->val; 22 } 23 24 void PushDown(pointer rt) 25 { 26 if(rt->tag) 27 { 28 rt->lson->tag += rt->tag; 29 rt->rson->tag += rt->tag; 30 rt->lson->val += rt->tag * rt->lson->len(); 31 rt->rson->val += rt->tag * rt->rson->len(); 32 rt->tag = 0; 33 } 34 } 35 36 void Build(pointer rt,int l, int r) 37 { 38 rt->l = l; 39 rt->r = r; 40 if(l + 1 == r) 41 { 42 rt->val = a[l]; 43 //rt->pos = l; 44 rt->rson = NULL; 45 rt->lson = NULL; 46 return ; 47 } 48 rt->rson = new Node(); 49 rt->lson = new Node(); 50 Build(rt->lson, l, rt->mid()); 51 Build(rt->rson, rt->mid(), r); 52 PushUp(rt); 53 } 54 55 void UpData(pointer rt, int L, int R, int k) 56 { 57 if(L <= rt->l && rt->r <= R) 58 { 59 rt->val += k * rt->len(); 60 rt->tag += k; 61 } 62 else 63 { 64 if(rt->tag != 0) PushDown(rt); 65 if(L < rt->mid()) UpData(rt->lson, L, R, k); 66 if(R > rt->mid()) UpData(rt->rson, L, R, k); 67 PushUp(rt); 68 } 69 } 70 71 long long Query(pointer rt, int L, int R) 72 { 73 if(L <= rt->l && rt->r <= R) return rt->val; 74 else 75 { 76 if(rt->tag != 0) PushDown(rt); 77 long long ret = 0; 78 if(L < rt->mid()) ret += Query(rt->lson, L, R); 79 if(R > rt->mid()) ret += Query(rt->rson, L, R); 80 return ret; 81 } 82 } 83 }; 84 85 int main() 86 { 87 int n, m; 88 int x, y, z, ord; 89 Segment_Tree tree; 90 scanf("%d%d", &n, &m); 91 for(int i = 1; i <= n; i ++) scanf("%lld", &tree.a[i]); 92 tree.Build(tree.rt, 1, n + 1); 93 for(int i = 1; i <= m; i ++) 94 { 95 scanf("%d", &ord); 96 if(ord == 1) 97 { 98 scanf("%d%d%d", &x, &y, &z); 99 tree.UpData(tree.rt, x, y + 1, z); 100 } 101 if(ord ==2) 102 { 103 scanf("%d%d", &x, &y); 104 printf("%lld ", tree.Query(tree.rt, x, y + 1)); 105 } 106 } 107 return 0; 108 }