1 #include<iostream>
2 #include<string>
3 #include<algorithm>
4 #include<cstdlib>
5 #include<cstdio>
6 #include<set>
7 #include<map>
8 #include<vector>
9 #include<cstring>
10 #include<stack>
11 #include<cmath>
12 #include<queue>
13 //#include <bits/stdc++.h>
14 using namespace std;
15 #define LL long long
16 const int maxn=100000;
17 struct node
18 {
19 LL sum,val;
20 }tree[maxn*4];
21
22 void pushup(int rt)
23 {
24 tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum;
25 }
26 void pushdown(int rt,int m)
27 {
28 if(tree[rt].val)
29 {
30 tree[rt<<1].val+=tree[rt].val;
31 tree[rt<<1|1].val+=tree[rt].val;
32 tree[rt<<1].sum+=(LL)(m-(m>>1))*tree[rt].val;
33 tree[rt<<1|1].sum+=(LL)(m>>1)*tree[rt].val;
34 tree[rt].val=0;
35 }
36 }
37
38 void build_tree(int l,int r,int rt)
39 {
40 tree[rt].val=0;
41 if(l==r)
42 {
43 scanf("%I64d",&tree[rt].sum);
44 return ;
45 }
46 int m=(l+r)>>1;
47 build_tree(l,m,rt<<1);
48 build_tree(m+1,r,rt<<1|1);
49 pushup(rt);
50 }
51
52 LL query(int L,int R,int l,int r,int rt)
53 {
54 if(L<=l&&r<=R)
55 {
56 return tree[rt].sum;
57 }
58 int m=(l+r)>>1;
59 pushdown(rt,r-l+1);
60 LL ans=0;
61 if(L<=m)
62 ans+=query(L,R,l,m,rt<<1);
63 if(m<R)
64 ans+=query(L,R,m+1,r,rt<<1|1);
65 pushup(rt);
66 return ans;
67 }
68
69 void update(int L,int R,int add,int l,int r,int rt)
70 {
71 if(L<=l&&r<=R)
72 {
73 tree[rt].sum+=(LL)add*(r-l+1);
74 tree[rt].val+=add;
75 return;
76 }
77 pushdown(rt,r-l+1);
78 int m=(l+r)>>1;
79 if(L<=m)
80 update(L,R,add,l,m,rt<<1);
81 if(R>m)
82 update(L,R,add,m+1,r,rt<<1|1);
83 pushup(rt);
84 }
85
86 int main()
87 {
88 int n,a,b,q;
89 LL c;
90 while(~scanf("%d%d",&n,&q))
91 {
92 build_tree(1,n,1);
93 char s[3];
94 while(q--)
95 {
96 scanf("%s",s);
97 if(s[0]=='Q')
98 {
99 cin>>a>>b;
100 cout<<query(a,b,1,n,1)<<endl;
101 }
102 else if(s[0]=='C')
103 {
104 cin>>a>>b>>c;
105 update(a,b,c,1,n,1);
106 }
107 }
108 }
109 return 0;
110 }