P3372 十点全WA
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i, a, b) for(int i = (a); i <= (b); ++ i)
#define per(i, a, b) for(int i = (a); i >= (b); -- i)
typedef long long ll;
typedef unsigned long long ull;
const int N = 100005;
const int INF = 0x3f3f3f3f;
int n, m, a[N];
struct sgt { int sum, add; } t[N << 2];
int ls(int rt) { return rt << 1; }
int rs(int rt) { return rt << 1 | 1; }
void pushup(int rt) { t[rt].sum = t[ls(rt)].sum + t[rs(rt)].sum; }
void build(int rt, int l, int r) {
t[rt].add = t[rt].sum = 0;
if(l == r) return t[rt].sum = a[l], void();
int mid = (l + r) >> 1;
build(ls(rt), l, mid), build(rs(rt), mid + 1, r);
pushup(rt);
}
void maketag(int rt, int l, int r, int v) {
t[rt].add += v;
t[rt].sum += v * (r - l + 1);
}
void pushdown(int rt, int l, int r) {
if(!t[rt].add) return;
int mid = (l + r) >> 1;
maketag(ls(rt), l, mid, t[rt].add);
maketag(rs(rt), mid + 1, r, t[rt].add);
t[rt].add = 0;
}
void update(int updl, int updr, int rt, int l, int r, int k) {
if(updl <= l && r <= updr) return maketag(rt, l, r, k), void();
pushdown(rt, l, r);
int mid = (l + r) >> 1;
if(updl <= mid) update(updl, updr, ls(rt), l, mid, k);
if(mid < updr) update(updl, updr, rs(rt), mid + 1, r, k);
}
int query(int qryl, int qryr, int rt, int l, int r) {
if(qryl <= l && r <= qryr) return t[rt].sum;
int res = 0, mid = (l + r) >> 1;
pushdown(rt, l, r);
if(qryl <= mid) res += query(qryl, qryr, ls(rt), l, mid);
if(mid < qryr) res += query(qryl, qryr, rs(rt), mid + 1, r);
return res;
}
void solve() {
cin >> n >> m; rep(i, 1, n) cin >> a[i];
build(1, 1, n);
rep(_, 1, m) {
int op; cin >> op;
if(op == 1) {
int x, y, k; cin >> x >> y >> k;
update(x, y, 1, 1, n, k);
} else if(op == 2) {
int x, y; cin >> x >> y;
cout << query(x, y, 1, 1, n) << '\n';
}
}
return;
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int T = 1;
// cin >> T;
while(T --) solve();
return 0;
}