#include #include #define endl "\n" using namespace std; long long const MAXN=100001; long long n, q, a[MAXN], tree[4*MAXN], lazy[4*MAXN], cnt[4*MAXN]; char type; void make_tree(int idx, int l, int r) { if(l == r) { tree[idx] = a[l]; return; } int mid = (l+r)/2; make_tree(idx*2, l, mid); make_tree(idx*2+1, mid+1, r); tree[idx] = tree[idx*2] + tree[idx*2+1]; } void push_lazy(int idx, int l, int r) { if(cnt[idx] % 2 == 0) tree[idx] = tree[idx] - (r-l+1)*lazy[idx]; else tree[idx] = (r-l+1)*lazy[idx] - tree[idx]; if(l != r) { if(cnt[idx*2] % 2 == 0) lazy[idx*2] += lazy[idx]; else lazy[idx*2] -= lazy[idx]; cnt[idx*2] += cnt[idx]; if(cnt[idx*2+1] % 2 == 0) lazy[idx*2+1] += lazy[idx]; else lazy[idx*2+1] -= lazy[idx]; cnt[idx*2+1] += cnt[idx]; } lazy[idx] = 0; cnt[idx] = 0; } void update(int idx, int l, int r, int ql, int qr, int val) { push_lazy(idx, l, r); if(l > r || ql > r || qr < l) return; if(ql <= l && qr >= r) { if(cnt[idx] % 2 == 0) lazy[idx] += val; else lazy[idx] -= val; cnt[idx] ++; push_lazy(idx, l, r); return; } int mid = (l+r)/2; update(idx*2, l, mid, ql, qr, val); update(idx*2+1, mid+1, r, ql, qr, val); tree[idx] = tree[idx*2] + tree[idx*2+1]; } long long query(int idx, int l, int r, int ql, int qr) { push_lazy(idx, l, r); if(l > r || ql > r || qr < l) return 0; if(ql <= l && qr >= r) return tree[idx]; int mid = (l+r)/2; return query(idx*2, l, mid, ql, qr) + query(idx*2+1, mid+1, r, ql, qr); } void read() { int l, r, x; cin>>n>>q; for(int i=1;i<=n;i++) { cin>>a[i]; } make_tree(1,1,n); for(int i=1;i<=q;i++) { cin>>type; if(type == '-') { cin>>l>>r>>x; update(1,1,n,l,r,x); } else { cin>>l>>r; cout<