Segment Tree.
The portal:http://poj.org/problem?id=3468
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <iostream>
const int MAXN = 100005;
struct Node {
int Left;
int Right;
long long value;
long long lazy;
}Segment_Tree[MAXN<<2];
long long a[MAXN];
int cnt ;
void Push_Up(int Now) {
Segment_Tree[Now].value = Segment_Tree[Now<<1].value + Segment_Tree[Now<<1|1].value;
}
void Push_Down(int Now) {
if(Segment_Tree[Now].lazy){
Segment_Tree[Now << 1].lazy += Segment_Tree[Now].lazy;
Segment_Tree[Now << 1|1].lazy += Segment_Tree[Now].lazy;
Segment_Tree[Now << 1].value += Segment_Tree[Now].lazy * (Segment_Tree[Now<<1].Right - Segment_Tree[Now<<1].Left + 1);
Segment_Tree[Now << 1|1].value += Segment_Tree[Now].lazy * (Segment_Tree[Now<<1|1].Right - Segment_Tree[Now<<1|1].Left + 1);
Segment_Tree[Now].lazy = 0;
}
}
void Build_Tree(int Left,int Right,int Now) {
Segment_Tree[Now].lazy = 0;
Segment_Tree[Now].Left = Left;
Segment_Tree[Now].Right = Right;
if(Left == Right) {
Segment_Tree[Now].value = a[cnt++];
return ;
}
int Mid = (Left + Right) >> 1;
Build_Tree(Left,Mid,Now<<1);
Build_Tree(Mid+1,Right,Now<<1|1);
Push_Up(Now);
}
void Update_Tree(int Left,int Right,int Now,int Update_left,int Update_right,long long lazy_value) {
if(Left >= Update_left && Right <= Update_right) {
Segment_Tree[Now].lazy += lazy_value;
Segment_Tree[Now].value += lazy_value * (Right - Left +1);
return ;
}
int Mid = (Left + Right) >> 1;
Push_Down(Now);
if(Mid >= Update_left) {
Update_Tree(Left,Mid,Now<<1,Update_left,Update_right,lazy_value);
}
if(Mid < Update_right) {
Update_Tree(Mid+1,Right,Now<<1|1,Update_left,Update_right,lazy_value);
}
Push_Up(Now);
}
long long Query_Tree(int Left,int Right,int Now,int Left_Edge,int Right_Edge) {
long long Query_Ans = 0;
if(Left >= Left_Edge && Right <= Right_Edge) {
return Segment_Tree[Now].value;
}
int Mid = (Left + Right) >> 1;
Push_Down(Now);
if(Mid >= Left_Edge) {
Query_Ans += Query_Tree(Left,Mid,Now<<1,Left_Edge,Right_Edge);
}
if(Mid < Right_Edge) {
Query_Ans += Query_Tree(Mid+1,Right,Now<<1|1,Left_Edge,Right_Edge);
}
return Query_Ans;
}
void Deal_with() {
int n,m;
while(~scanf("%d %d",&n,&m)) {
for(int i = 1 ; i <= n ; i ++) {
scanf("%lld",a+i);
}
cnt = 1;
Build_Tree(1,n,1);
char tempc;
int Left,Right;
long long value;
for(int i = 1 ; i <= m ; i ++) {
getchar();
scanf("%c %d %d",&tempc,&Left,&Right);
if(tempc == 'Q') {
printf("%lld\n",Query_Tree(1,n,1,Left,Right));
}
else {
scanf("%lld",&value);
Update_Tree(1,n,1,Left,Right,value);
}
}
}
}
int main(void) {
//freopen("a.in","r",stdin);
Deal_with();
return 0;
}