#include using namespace std; typedef long long ll; template void check_min(T &a, const T &b){ a = (a < b) ? a : b; } template void check_max(T &a, const T &b){ a = (a > b) ? a : b; } #define all(x) (x).begin(), (x).end() const int N = 1e5 + 3; int n; struct SegmentTree{ ll sum[4 * N]; ll add[4 * N]; bool neg[4 * N]; void push_lazy(int i, int l, int r){ if(!neg[i]){ sum[i] += (r - l + 1) * add[i]; if(l != r){ add[2 * i + 1] += add[i]; add[2 * i + 2] += add[i]; } add[i] = 0; } else{ sum[i] = (r - l + 1) * add[i] - sum[i]; if(l != r){ neg[2 * i + 1] ^= true; neg[2 * i + 2] ^= true; add[2 * i + 1] *= -1; add[2 * i + 2] *= -1; add[2 * i + 1] += add[i]; add[2 * i + 2] += add[i]; } neg[i] = false; add[i] = 0; } } void q_negate(int sl, int sr, int i = 0, int l = 1, int r = n){ push_lazy(i, l, r); if(sr < l || r < sl) return; if(sl <= l && r <= sr){ neg[i] = !neg[i]; add[i] = -add[i]; push_lazy(i, l, r); return; } int mid = (l + r) >> 1; q_negate(sl, sr, 2 * i + 1, l, mid); q_negate(sl, sr, 2 * i + 2, mid + 1, r); sum[i] = sum[2 * i + 1] + sum[2 * i + 2]; } void q_add(int sl, int sr, ll val, int i = 0, int l = 1, int r = n){ push_lazy(i, l, r); if(sr < l || r < sl) return; if(sl <= l && r <= sr){ add[i] += val; // cout << sum[i] << " " << add[i] << endl; push_lazy(i, l, r); // cout << sum[i] << " " << add[i] << " after" << endl; return; } int mid = (l + r) >> 1; q_add(sl, sr, val, 2 * i + 1, l, mid); q_add(sl, sr, val, 2 * i + 2, mid + 1, r); sum[i] = sum[2 * i + 1] + sum[2 * i + 2]; } ll query(int sl, int sr, int i = 0, int l = 1, int r = n){ push_lazy(i, l, r); if(sr < l || r < sl) return 0; if(sl <= l && r <= sr) return sum[i]; int mid = (l + r) >> 1; return query(sl, sr, 2 * i + 1, l, mid) + query(sl, sr, 2 * i + 2, mid + 1, r); } } seg_tr; void files(string name){ freopen((name + ".in").c_str(), "r", stdin); freopen((name + ".out").c_str(), "w", stdout); } int main(){ ios::sync_with_stdio(false); cin.tie(NULL); files("accounting"); int q; cin >> n >> q; vector a(n + 1); for(int i = 1; i <= n; ++i){ cin >> a[i]; seg_tr.q_add(i, i, a[i]); } for(int i = 1; i <= q; ++i){ char t; cin >> t; if(t == '-'){ int l, r, x; cin >> l >> r >> x; seg_tr.q_negate(l, r); seg_tr.q_add(l, r, x); } else{ int l, r; cin >> l >> r; cout << seg_tr.query(l, r) << "\n"; } } }