POJ-3468
Description
You have N integers, A1, A2, … , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of numbers in a given interval.
Input
The first line contains two numbers N and Q. 1 ≤ N,Q ≤ 100000.
The second line contains N numbers, the initial values of A1, A2, … , AN. -1000000000 ≤ Ai ≤ 1000000000.
Each of the next Q lines represents an operation.
“C a b c” means adding c to each of Aa, Aa+1, … , Ab. -10000 ≤ c ≤ 10000.
“Q a b” means querying the sum of Aa, Aa+1, … , Ab.
Output
You need to answer all Q commands in order. One answer in a line.
Sample Input
10 5
1 2 3 4 5 6 7 8 9 10
Q 4 4
Q 1 10
Q 2 4
C 3 6 3
Q 2 4
Sample Output
4
55
9
15
Hint
The sums may exceed the range of 32-bit integers.(!!!)
#include <stdio.h>
const int N = 100005;
long long a[N];
long long tree[N*4];
long long lazy[N*4];
void push_up(int root){
tree[root] = tree[root << 1] + tree[root << 1 | 1];
}
void push_down(int root, int len){
lazy[root << 1] += lazy[root];
lazy[root << 1 | 1] += lazy[root];
tree[root << 1] += (len - (len >> 1)) * lazy[root];
tree[root << 1 | 1] += (len >> 1) * lazy[root];
lazy[root] = 0;
}
void build(int root, int l, int r){
if(l == r){
scanf("%lld", &a[l]);
tree[root] = a[l];
return;
}
int m = l+r >> 1;
build(root << 1, l, m);
build(root << 1 | 1, m + 1, r);
push_up(root);
}
void update(int L, int R, int add, int root, int l, int r){
if(L <= l && r <= R){
tree[root] += (r - l + 1) * add;
lazy[root] += add;
return;
}
// if(lazy[root])
push_down(root, r - l + 1);
int m = l+r >> 1;
if(L <= m) update(L, R, add, root << 1, l, m);
if(R > m) update(L, R, add, root << 1 | 1, m + 1, r);
push_up(root);
}
long long query(int L, int R, int root, int l, int r){
if(L <= l && r <= R){
return tree[root];
}
if(lazy[root]) push_down(root, r - l + 1);
int m = l +r >> 1;
long long ans = 0;
if(L <= m) ans += query(L, R, root << 1, l, m);
if(R > m) ans += query(L, R, root << 1|1, m + 1, r);
return ans;
}
int main(){
//freopen("data1.in","r",stdin);
int n, un;
scanf("%d %d", &n, &un);
build(1, 1, n);
//printf("over\n");
while(un--){
char op[2];
scanf("%s", op);
if(op[0] == 'C'){
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
update(a, b, c, 1, 1, n);
// printf("dfgert\n");
}
//printf("over\n");
if(op[0] == 'Q'){
int a, b;
scanf("%d %d", &a, &b);
// printf("dsfdsf\n");
printf("%lld\n", query(a, b, 1, 1, n));
}
}
return 0;
}