#include using namespace std; const long long maxn = 1e5 + 10; long long n, a[maxn]; long long tree[4 * maxn], lazy[4 * maxn], p[4 * maxn]; void make_tree(long long i, long long l, long long r){ if(l == r){ tree[i] = a[l]; return; } long long mid = (l + r) / 2; make_tree(2 * i, l, mid); make_tree(2 * i + 1, mid + 1, r); tree[i] = tree[2 * i] + tree[2 * i + 1]; } void push_lazy(long long i, long long l, long long r){ if(p[i] || lazy[i]){ tree[i] = (r - l + 1) * lazy[i] - tree[i]; if(l != r){ lazy[2 * i] += lazy[i]; lazy[2 * i + 1] += lazy[i]; p[2 * i] = 1, p[2 * i + 1] = 1; } lazy[i] = 0; p[i] = 0; } } long long query(long long idx, long long l, long long r, long long ql ,long long qr){ push_lazy(idx, l, r); if(ql > r || qr < l || l > r) return 0; if(ql <= l && qr >= r) return tree[idx]; long long mid = (l + r) / 2; return query(2 * idx, l, mid, ql, qr) + query(2 * idx + 1, mid + 1, r, ql ,qr); } void update(long long idx, long long l, long long r, long long ql, long long qr, long long val){ push_lazy(idx, l, r); if(ql > r || qr < l || l > r) return; if(ql <= l && qr >= r){ lazy[idx] += val; p[idx] = 1; push_lazy(idx, l, r); return; } long long mid = (l + r) / 2; update(2 * idx, l, mid, ql, qr, val); update(2 * idx + 1, mid + 1, r, ql, qr, val); tree[idx] = tree[2 * idx] + tree[2 * idx + 1]; } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); ifstream in("accounting.in"); ofstream out("accounting.out"); long long n, q; in >> n >> q; for(long long i = 1;i <= n;i++){ in >> a[i]; } make_tree(1, 1, n); for(long long i = 0;i < q;i++){ char c1; in >> c1; if(c1 == '-'){ long long l1, r1, x1; in >> l1 >> r1 >> x1; update(1, 1, n, l1, r1, x1); } else{ long long l1, r1; in >> l1 >> r1; out << query(1, 1, n, l1, r1) << endl; } } return 0; }