1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 const int Maxn = 1000050; 6 namespace seqtree 7 { 8 struct Tree 9 { 10 Tree *ch[2]; 11 long long _v, label; 12 int Num, _l, _r, mid; 13 Tree() { _v = label = 0; Num = 1; } 14 void update(); 15 void maintain(); 16 }Node[Maxn], *null, *Root; 17 int tot = 0, _k, _L, _R; 18 long long v; 19 void Tree::update() 20 { 21 if(!label) return; 22 _v += Num*label; 23 if(Num != 1) ch[0]->label += label, ch[1]->label += label; 24 label = 0; 25 } 26 void Tree::maintain() 27 { 28 ch[0]->update(); ch[1]->update(); 29 _v = ch[0]->_v + ch[1]->_v; 30 } 31 void protect() 32 { 33 null = new Tree(); 34 null->ch[0] = null->ch[1] = null; null->Num = 0; 35 } 36 void insert(Tree *&o, int l, int r) 37 { 38 int mid = (l+r)/2; 39 if(o == null) 40 { 41 o = &Node[tot++]; 42 o->ch[0] = o->ch[1] = null; 43 o->_l = l; o->_r = r; o->mid = (l+r)/2; 44 } 45 if(l == r) { o->_v = v; return; } 46 if(_k <= mid) insert(o->ch[0], l, mid); 47 else insert(o->ch[1], mid+1, r); 48 o->maintain(); o->Num = o->ch[1]->Num + o->ch[0]->Num; 49 } 50 Tree* Build(int n, long long *a) 51 { 52 protect(); Root = null; 53 for(int i = 1; i <= n; i++) _k = i, v = a[i], insert(Root, 1, n); 54 return Root; 55 } 56 long long query(Tree *o) 57 { 58 long long ans = 0; 59 o->update(); 60 if(_L <= o->_l && o->_r <= _R) return o->_v; 61 if(_L <= o->mid) ans += query(o->ch[0]); 62 if(_R > o->mid) ans += query(o->ch[1]); 63 return ans; 64 } 65 long long Query(int L, int R) { _L = L; _R = R; return query(Root); } 66 void change(Tree *o) 67 { 68 o->update(); 69 if(_L <= o->_l && o->_r <= _R) { o->label += v; o->update(); return; } 70 if(_L <= o->mid) change(o->ch[0]); if(_R > o->mid) change(o->ch[1]); 71 o->maintain(); 72 } 73 void Change(int L, int R, int V) { _L = L; _R = R; v = V; change(Root); } 74 }; 75 using namespace seqtree; 76 long long a[Maxn]; 77 int main() 78 { 79 int n, x; 80 freopen("a.txt", "r", stdin); 81 scanf("%d", &n); 82 for(int i = 1; i <= n; i++) scanf("%lld", &a[i]); 83 Build(n, a); 84 int Q, L, R; 85 scanf("%d", &Q); 86 while(Q--) 87 { 88 scanf("%d", &x); 89 if(x == 0) 90 { 91 scanf("%d %d %d", &L, &R, &x); 92 Change(L, R, x); 93 }else 94 { 95 scanf("%d %d", &L, &R); 96 printf("%lld ", Query(L, R)); 97 } 98 } 99 }