题目链接:A Simple Problem with Integers
#include <iostream>
#include <algorithm>
#include <map>
#include <stack>
#include <queue>
#include <set>
#include <vector>
#include <cstdlib>
#include <cmath>
#include <string>
#include <cstdio>
#include <cstring>
#include <assert.h>
#define lowbit(x) (x&(-x))
#define ll long long
#define ull unsigned long long
#define max(a, b) (a>b?a:b)
#define min(a, b) (a>b?b:a)
#define PI acos(-1.0)
#define fir first
#define sec second
#define SZ(x) (x.size())
#define inf 0x3f3f3f3f
#define PB push_back
#define MP make_pair
#define all(x) (x).begin(),(x).end()
#define PII pair<int,int>
#define E 2.7182818284590452353602874713527
using namespace std;
#define ll long long
#define all(x) (x).begin(),(x).end()
using namespace std;
void scan() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
}
const int INF = 0x3f3f3f3f;
const int maxn = 2e5 + 7;
ll a[maxn], st[maxn << 2], cha[maxn << 2];
void build(int o, int l, int r) {
if (l == r) {
st[o] = a[l];
return;
}
int mid = l + ((r - l >> 1));
build(o << 1, l, mid);
build(o << 1 | 1, mid + 1, r);
st[o] = st[o << 1] + st[o << 1 | 1];
}
void push_up(int o) {
st[o] = st[o << 1] + st[o << 1 | 1];
}
void push_down(int o, int l, int r) {
if (cha[o]) {
cha[o << 1] += cha[o];
cha[o << 1 | 1] += cha[o];
int mid = l + ((r - l) >> 1);
st[o << 1] += cha[o] * (mid - l + 1);
st[o << 1 | 1] += cha[o] * (r - mid);
cha[o] = 0;
}
}
void update(int o, int l, int r, int ql, int qr, ll c) {//区间加
if (ql <= l && qr >= r) {
cha[o] += c;
st[o] += 1ll * (r - l + 1) * c;
return;
}
push_down(o, l, r);
int mid = l + ((r - l) >> 1);
if (ql <= mid) update(o << 1, l, mid, ql, qr, c);
if (qr >= mid + 1) update(o << 1 | 1, mid + 1, r, ql, qr, c);
push_up(o);
}
ll query(int o, int l, int r, int ql, int qr) {//和
if (ql <= l && qr >= r) return st[o];
int mid = l + ((r - l) >> 1);
push_down(o, l, r);
ll ans = 0;
if (ql <= mid) ans += query(o << 1, l, mid, ql, qr);
if (qr >= mid + 1) ans += query(o << 1 | 1, mid + 1, r, ql, qr);
return ans;
}
int main() {
int n;
scanf("%d", &n);
int Q;
scanf("%d", &Q);
for (int i = 1; i <= n; i++) scanf("%lld", &a[i]);
memset(cha, 0, sizeof(cha));
build(1, 1, n);
while (Q--) {
string ch;
cin >> ch;
int ql, qr;
scanf("%d %d", &ql, &qr);
if (ch[0] == 'Q') printf("%lld\n", query(1, 1, n, ql, qr));
else {
ll c;
scanf("%lld", &c);
update(1, 1, n, ql, qr, c);
}
}
return 0;
}