线段树模板 1
#include <bits/stdc++.h>
#define ll long long
#define ls (p << 1)
#define rs ((p << 1) | 1)
using namespace std;
inline ll read(){
int f = 1;
ll x = 0;
char ch = getchar();
while(!isdigit(ch)){
if(ch == '-')f = -1;
ch = getchar();
}
while(isdigit(ch)){
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
return x * f;
}
inline void print(ll x){
if(x > 9)print(x / 10);
putchar(x % 10 + '0');
}
ll a[100010], laze[400010], d[400010];
inline void push_up(ll p){
d[p] = d[ls] + d[rs];
}
inline void build(ll s, ll t, ll p){
if(s == t){
d[p] = a[p];
return;
}
ll mid = s + ((t - s) >> 1);
build(s, mid, ls);
build(mid + 1, t, rs);
push_up(p);
}
inline void push_down(ll s, ll t, ll p){
ll mid = s + ((t - s) >> 1);
laze[ls] += laze[p];
laze[rs] += laze[p];
d[ls] += laze[p] * (mid - s + 1);
d[rs] += laze[p] * (t - mid);
laze[p] = 0;
}
inline void update(ll l, ll r, ll c, ll s, ll t, ll p){
if(l <= s && t <= r){
d[p] += (t - s + 1) * c, laze[p] += c;
return ;
}
push_down(s, t, p);
ll mid = s + ((t - s) >> 1);
if(l <= mid)update(l, r, c, s, mid, ls);
if(r > mid)update(l, r, c, mid + 1, t, rs);
push_up(p);
}
inline ll getsum(ll l, ll r, ll s, ll t, ll p){
if(l <= s && t <= r)
return d[p];
ll mid = s + ((t - s) >> 1), sum = 0;
push_down(s, t, p);
if(l <= mid)sum = getsum(l, r, s, mid, ls);
if(r > mid)sum += getsum(l, r, mid + 1, t, rs);
return sum;
}
signed main(){
ll n = read(), q = read();
for(ll i = 1;i <= n;i++)
a[i] = read();
build(1, n, 1);
while(q--){
ll op = read();
if(op == 1){
ll x = read(), y = read(), k = read();
update(x, y, k, 1, n, 1);
}else{
ll x = read(), y = read();
cout << getsum(x, y, 1, n, 1), putchar('\n');
}
}
return 0;
}