<pre lang="cpp" line="1">
/*
Mail to : miyubai@gamil.com
My Blog : www.baiyun.me
Link : http://www.cnblogs.com/MiYu || http://www.cppblog.com/MiYu
Author By : MiYu
Test : 1
Complier : g++ mingw32-3.4.2
Program :
Doc Name :
*/
//#pragma warning( disable:4789 )
#include <iostream>
#include <fstream>
#include <sstream>
#include <algorithm>
#include <string>
#include <set>
#include
<map>
#include <utility>
#include <queue>
#include <stack>
#include
<list>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
using namespace std;
inline bool scan_d(int &num) //整数输入
{
char in;bool IsN=false;
in=getchar();
if(in==EOF) return false;
while(in!='-'&&(in<'0'||in>'9')) in=getchar();
if(in=='-'){ IsN=true;num=0;}
else num=in-'0';
while(in=getchar(),in>='0'&&in<='9'){
num*=10,num+=in-'0';
}
if(IsN) num=-num;
return true;
}
struct seg_tree{
int l,r,val;
long long sum;
int mid () { return (r+l) >> 1; }
int dis () { return r-l+1; }
}seg[600000];
int v[100010];
void creat ( int x, int y, int rt = 1 ) {
seg[rt].l = x;
seg[rt].r = y;
seg[rt].val = 0;
if ( x == y ) {
return ;
}
int mid = seg[rt].mid();
creat ( x, mid, rt << 1 );
creat ( mid + 1, y, rt << 1 | 1 );
}
long long cr ( int x, int y, int rt = 1 ) {
seg[rt].val = 0;
if ( seg[rt].l == seg[rt].r ) {
seg[rt].sum = v[x];
return v[x];
}
int mid = seg[rt].mid();
return seg[rt].sum = cr ( x, mid, rt << 1 )
+ cr ( mid + 1, y, rt << 1 | 1 );
}
inline void pushdown ( int rt ) {
int LL = rt << 1, RR = rt << 1 | 1, mid = seg[rt].mid();
if ( seg[rt].val ) {
seg[LL].sum += (long long)seg[LL].dis() * seg[rt].val;
seg[RR].sum += (long long)seg[RR].dis() * seg[rt].val;
seg[LL].val += seg[rt].val;
seg[RR].val += seg[rt].val;
seg[rt].val = 0;
}
}
void md ( int x, int y, int val, int rt = 1 ) {
if ( seg[rt].l == x && seg[rt].r == y ) {
seg[rt].val += val;
seg[rt].sum += (long long)seg[rt].dis() * val;
return;
}
int LL = rt << 1, RR = rt << 1 | 1, mid = seg[rt].mid();
pushdown ( rt );
if ( x > mid ) md ( x, y, val, RR );
else if ( y <= mid ) md ( x, y, val, LL );
else {
md ( x, mid, val, LL );
md ( mid+1, y, val, RR );
}
seg[rt].sum = seg[LL].sum + seg[RR].sum;
}
long long q ( int x, int y, int rt = 1 ) {
if ( seg[rt].l == x && seg[rt].r == y ) {
return seg[rt].sum;
}
pushdown ( rt );
int LL = rt << 1, RR = rt << 1 | 1, mid = seg[rt].mid();
if ( x > mid ) return q ( x, y, RR );
else if ( y <= mid ) return q ( x, y, LL );
else {
return q ( x, mid, LL ) + q ( mid + 1, y, RR );
}
}
int main ()
{
int N, M;
creat ( 1, 100000 );
while ( scanf ( "%d%d", &N, &M ) == 2 ) {
for ( int i = 1; i <= N; ++ i ) scanf ( "%d", &v[i] );
cr ( 1, N );
while ( M -- ) {
char s[5];
int x, y, val;
scanf ( "%s", s );
switch ( s[0] ) {
case 'Q':
scanf ( "%d%d", &x, &y );
printf ( "%lld\n", q ( x, y ) );
break;
case 'C':
scanf ( "%d%d%d", &x, &y, &val );
md ( x, y, val );
}
}
}
return 0;
}
</pre>