1 /*
2 区间修改,区间查询和;
3 第一次使用lazy思想;
4 poj3468
5 */
6 #include<iostream>
7 #include<cstdio>
8 #include<cstring>
9 #include<algorithm>
10 #define ll long long
11 using namespace std;
12 typedef struct
13 {
14 int l,r;
15 ll add;
16 ll value;
17 }V;
18
19 int n,m,a[100005]={0};
20
21 V tr[400010]={0};
22 void Pushup(int rt)
23 {
24 tr[rt].value=tr[rt<<1].value+tr[(rt<<1)|1].value;
25 }
26 void Pushdown(int rt,int m)
27 {
28 if(tr[rt].add)
29 {
30 tr[rt<<1].add+=tr[rt].add;
31 tr[(rt<<1)|1].add+=tr[rt].add;
32 tr[rt<<1].value+=tr[rt].add*(m-(m>>1));
33 tr[(rt<<1)|1].value+=tr[rt].add*(m>>1);
34 tr[rt].add=0;
35 }
36 }
37 void build(int i,int l,int r)
38 {
39 tr[i].l=l;
40 tr[i].r=r;
41 tr[i].add=0;
42 if(l==r)
43 {
44 tr[i].value=a[l];
45 return ;
46 }
47 int mid=(l+r)/2;
48 build(i<<1,l,mid);
49 build((i<<1)|1,mid+1,r);
50 Pushup(i);
51 }
52 void Update(int i,int l,int r,int x)
53 {
54 if(tr[i].l==l&&tr[i].r==r)
55 {
56 tr[i].add+=x;
57 tr[i].value+=(ll)x*(r-l+1);
58 return ;
59 }
60 if(tr[i].l==tr[i].r)
61 return ;
62 Pushdown(i,tr[i].r-tr[i].l+1);
63 int t=i<<1;
64 if(l<=tr[t].r)
65 {
66 if(r<=tr[t].r)
67 Update(t,l,r,x);
68 else
69 Update(t,l,tr[t].r,x);
70 }
71 t+=1;
72 if(r>=tr[t].l)
73 {
74 if(l>=tr[t].l)
75 Update(t,l,r,x);
76 else
77 Update(t,tr[t].l,r,x);
78 }
79 Pushup(i);
80 }
81 ll Query(int i,int l,int r)
82 {
83 if(tr[i].l==l&&tr[i].r==r)
84 {
85 return tr[i].value;
86 }
87 Pushdown(i,tr[i].r-tr[i].l+1);
88 ll ans=0;
89 i=i<<1;
90 if(l<=tr[i].r)
91 {
92 if(r<=tr[i].r)
93 ans+=Query(i,l,r);
94 else
95 ans+=Query(i,l,tr[i].r);
96 }
97 i+=1;
98 if(r>=tr[i].l)
99 {
100 if(l>=tr[i].l)
101 ans+=Query(i,l,r);
102 else
103 ans+=Query(i,tr[i].l,r);
104 }
105 return ans;
106 }
107 int main()
108 {
109 while(scanf("%d%d",&n,&m)!=EOF)
110 {
111 memset(a,0,sizeof(a));
112 memset(tr,0,sizeof(tr));
113 for(int i=1;i<=n;i++)
114 scanf("%d",&a[i]);
115 build(1,1,n);
116 for(int i=0;i<m;i++)
117 {
118 char s[2];
119 int x1,x2,x3;
120 scanf("%s",s);
121 if(s[0]=='C')
122 {
123 scanf("%d%d%d",&x1,&x2,&x3);
124 Update(1,x1,x2,x3);
125 }
126 else
127 {
128 scanf("%d%d",&x1,&x2);
129 printf("%I64d\n",Query(1,x1,x2));
130 }
131 }
132 }
133 return 0;
134 }