#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
ll n, m, a[N];
struct node {
ll l, r, w, lz;
}tree[N<<2];
void build(ll u, ll l, ll r) {
tree[u].lz=0;
tree[u].l=l, tree[u].r=r;
if (l==r) {
tree[u].w=a[l];
return;
}
ll mid=l+r>>1;
build((u<<1)+1, mid+1, r), build(u<<1, l, mid);
tree[u].w = tree[u<<1].w + tree[(u<<1)+1].w;
}
void maketag(ll u, ll len, ll k) {
tree[u].lz+=k;
tree[u].w+=len*k;
}
void update(ll u, ll l, ll r, ll L, ll R, ll k) {
if (L>=l && R<=r) maketag(u, L-R+1, k);
else if (L<l && R>r) return;
else {
ll mid=l+r>>1;
maketag(u<<1, mid-l+1, tree[u].lz), maketag((u<<1)+1, r-mid, tree[u].lz);
tree[u].lz=0;
update(u<<1, l, mid, L, R, k), update((u<<1)+1, mid+1, r, L, R, k);
tree[u].w = tree[u<<1].w + tree[(u<<1)+1].w;
}
}
ll query(ll u, ll l, ll r, ll L, ll R) {
if (L>=l && R<=r) return tree[u].w;
else if (L<l && R>r) return 0;
else {
ll mid=l+r>>1;
maketag(u<<1, mid-l+1, tree[u].lz), maketag((u<<1)+1, r-mid, tree[u].lz);
tree[u].lz=0;
return query(u<<1, l, mid, L, R) + query((u<<1)+1, mid+1, r, L, R);
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin>>n>>m;
for (int i=1; i<=n; i++) cin>>a[i];
build(1, 1, n);
while (m--) {
ll opt, x, y;
cin>>opt>>x>>y;
if (opt==1) {
ll k;
cin>>k;
update(1, 1, n, x, y, k);
}else cout<<query(1, 1, n, x, y)<<"\n";
}
return 0;
}
看得自己人麻了,实在找不到哪里出了问题,求条qwq