https://vjudge.net/contest/66989#problem/C
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<algorithm> 6 #include<cmath> 7 #define lson (i<<1) 8 #define rson (i<<1|1) 9 typedef long long ll; 10 using namespace std; 11 const int maxn=1e5+5; 12 ll val[maxn]; 13 14 struct Seg 15 { 16 int l,r; 17 ll lazy,val; 18 }tree[maxn<<2]; 19 20 void push_up(int i) 21 { 22 tree[i].val=tree[lson].val+tree[rson].val; 23 } 24 25 void push_down(int i) 26 { 27 if(tree[i].lazy==0) 28 { 29 return; 30 } 31 tree[lson].lazy+=tree[i].lazy; 32 tree[lson].val+=tree[i].lazy*(tree[lson].r-tree[lson].l+1); 33 tree[rson].lazy+=tree[i].lazy; 34 tree[rson].val+=tree[i].lazy*(tree[rson].r-tree[rson].l+1); 35 tree[i].lazy=0; 36 } 37 38 void Build(int l,int r,int i=1) 39 { 40 tree[i].l=l; 41 tree[i].r=r; 42 tree[i].lazy=0; 43 if(l==r) 44 { 45 tree[i].val=val[l]; 46 return; 47 } 48 // push_down(i); 49 int mid=(tree[i].l+tree[i].r)>>1; 50 Build(l,mid,lson); 51 Build(mid+1,r,rson); 52 push_up(i); 53 } 54 55 ll Query(int l,int r,int i=1) 56 { 57 if(tree[i].l==l&&tree[i].r==r) 58 { 59 return tree[i].val; 60 } 61 push_down(i); 62 int mid=(tree[i].l+tree[i].r)>>1; 63 if(r<=mid) 64 { 65 return Query(l,r,lson); 66 } 67 else if(l>mid) 68 { 69 return Query(l,r,rson); 70 } 71 else 72 { 73 return Query(l,mid,lson)+Query(mid+1,r,rson); 74 } 75 } 76 77 void Add(int l,int r,ll x,int i=1) 78 { 79 if(tree[i].l==l&&tree[i].r==r) 80 { 81 tree[i].lazy+=x; 82 tree[i].val+=x*(ll)(r-l+1); 83 return; 84 } 85 push_down(i); 86 int mid=(tree[i].l+tree[i].r)>>1; 87 if(r<=mid) 88 { 89 Add(l,r,x,lson); 90 } 91 else if(l>mid) 92 { 93 Add(l,r,x,rson); 94 } 95 else 96 { 97 Add(l,mid,x,lson); 98 Add(mid+1,r,x,rson); 99 } 100 push_up(i); 101 } 102 103 int main() 104 { 105 int n,m; 106 while(~scanf("%d%d",&n,&m)) 107 { 108 for(int i=1;i<=n;i++) 109 { 110 scanf("%lld",&val[i]); 111 } 112 Build(1,n); 113 char q[20]; 114 int a,b,c; 115 for(int i=1;i<=m;i++) 116 { 117 scanf("%s%d%d",q,&a,&b); 118 if(q[0]=='Q') 119 { 120 printf("%lld ",Query(a,b)); 121 } 122 else 123 { 124 scanf("%d",&c); 125 Add(a,b,c); 126 } 127 } 128 } 129 return 0; 130 }