#include #define MAXN 1000005 #define endl '\n' using namespace std; int n, q; long long values[MAXN]; long long segTree[MAXN]; long long query(int l, int r, int beg, int end_, int idx) { if(r < beg || l > end_) return 0; if(l <= beg && r >= end_) return segTree[idx]; return query(l, r, beg, (beg + end_) / 2, idx * 2) + query(l, r, (beg + end_) / 2 + 1, end_, idx * 2 + 1); } void update(int node, int l, int r, int index, long long value) { if(index < l || index > r) return; if(l == r) { segTree[node] = value; return; } int middle = (l + r) / 2; update(node * 2, l, middle, index, value); update(node * 2 + 1, middle + 1, r, index, value); segTree[node] = segTree[node * 2] + segTree[node * 2 + 1]; } void build(int node, int l, int r) { if(l == r) { segTree[node] = values[l]; return; } int middle = (l + r) / 2; build(node * 2, l, middle); build(node * 2 + 1, middle + 1, r); segTree[node] = segTree[node * 2] + segTree[node * 2 + 1]; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); freopen("accounting.in","r",stdin); freopen("accounting.out","w",stdout); cin >> n >> q; for (int i = 1; i <= n; i++) cin >> values[i]; build(1, 1, n); while (q--) { char type; cin >> type; if (type == '?') { int x, y; cin >> x >> y; cout << query(x, y, 1, n, 1) << endl; } else { int x, y; cin >> x >> y; long long c; cin >> c; for (int i = x; i <= y; i++) { values[i] = c - values[i]; update(1, 1, n, i, values[i]); } } } return 0; }