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 4Sample Output
4 55 9 15Hint
The sums may exceed the range of 32-bit integers. 线段树功能 :update: 成段增减 query: 区间求和 #include <stdio.h> #define ll long long #define size 110000 #define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 long long sum[size<<2], add[size<<2]; void pushup( int rt) { sum[rt] = sum[rt<<1] + sum[rt<<1|1]; } void pushdown(int rt, int m) { if(add[rt]) { add[rt<<1] += add[rt]; add[rt<<1|1] += add[rt]; sum[rt<<1] += ( m - (m>>1)) * add[rt]; sum[rt<<1|1] += (m>>1) * add[rt]; add[rt] = 0; } } void build( int l, int r, int rt) { add[rt] = 0; if( l == r) { scanf("%lld",&sum[rt]); return; } int m = ( l + r) >> 1; build(lson); build(rson); pushup(rt); } void updata( int L, int R, int c, int l, int r, int rt) { if( L <= l && r <= R) { add[rt] += c; sum[rt] += (ll)c * ( r - l + 1);return; } pushdown(rt, r - l + 1); int m = (l + r) >> 1; if( L <= m) updata(L, R, c, lson); if( R > m) updata(L, R, c, rson); pushup(rt); } long long qurey( int L, int R, int l, int r, int rt) { if( L <= l && r <= R ) { return sum[rt]; } pushdown(rt, r - l + 1); int m = ( l + r) >> 1; ll ans = 0; if( L <= m) ans += qurey(L, R, lson); if( R > m) ans += qurey(L, R, rson); return ans; } int main() { int n, m; char s[10];int a, b, c; scanf("%d%d", &n, &m); build(1, n, 1); while(m--) { scanf("%s", s); if(s[0] == 'Q') { scanf("%d%d",&a, &b); printf("%lld\n",qurey(a, b, 1, n, 1)); } else { scanf("%d%d%d",&a,&b,&c);updata(a, b, c, 1, n, 1); } } }