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<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<bitset>
#include<cassert>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<deque>
#include<iomanip>
#include<list>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
using namespace std;
typedef long long ll;
const double pi = acos(-1.0);
const ll mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
const int maxn = 1e5 + 50;
ll a[maxn];
ll n, q;
ll sum1[maxn];
ll sum2[maxn];
ll lowbit(int k)
{
return k&-k;
}
void updata(int i, int k)
{
ll x = i;
while(i <= n)
{
sum1[i] += k;
sum2[i] += k * (x - 1);
i += lowbit(i);
}
}
ll get_sum(ll k)
{
ll x = k;
ll ans = 0;
while(k > 0)
{
ans += ((x * sum1[k]) - sum2[k]);
k -= lowbit(k);
}
return ans;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> q;
for(int i=1;i<=n;i++)
{
cin >> a[i];
updata(i, a[i] - a[i-1]);
}
while(q--)
{
char ch;
ll u, v, w;
cin >>ch;
if(ch == 'Q')
{
cin >> u >> v;
cout << get_sum(v) - get_sum(u-1) << endl;
}
else if(ch == 'C')
{
cin >> u >> v >> w;
updata(u, w);
updata(v+1, -w);
}
}
return 0;
}