rt
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 10;
int ans[N*4],p[N*4],lazy[N*4];
int n,m;
inline int ls(int x)
{
return x << 1;
}
inline int rs(int x)
{
return x << 1 | 1;
}
inline int push_up(int x)
{
ans[x] = (ans[ls(x)] + ans[rs(x)]);
}
inline void build(int k,int l,int r)
{
if(l == r){ans[k] = p[l]; return ;}
int mid = l + r >> 1;
build(ls(k),l,mid);
build(rs(k),mid + 1,r);
push_up(k);
}
inline void f(int k,int l,int r,int s)
{
ans[k] += (r - l + 1) * s;
lazy[k] += s;
}
inline void push_down(int l,int r,int k)
{
int mid = l + r >> 1;
f(ls(k),l,mid,lazy[k]);
f(rs(k),mid + 1,r,lazy[k]);
lazy[k] = 0;
}
inline void update(int nl,int nr,int l,int r,int k,int s)
{
if(nl <= l && nr >= r)
{
ans[k] += (r - l + 1) * s;
lazy[k] += s;
return ;
}
int mid = l + r >> 1;
push_down(l,r,k);
if(mid >= nl) update(nl,nr,l,mid,ls(k),s);
if(mid < nr) update(nl,nr,mid + 1,r,rs(k),s);
push_up(k);
}
inline int query(int q_l,int q_r,int l,int r,int k)
{
if(q_l <= l && q_r >= r) return ans[k];
int res = 0,mid = l + r >> 1;
push_down(l,r,k);
if(mid >= q_l) res += query(q_l,q_r,l,mid,ls(k));
if(mid < q_r) res += query(q_l,q_r,mid + 1,r,rs(k));
return res;
}
signed main(){
ios::sync_with_stdio(0);
cin >> n >> m;
for(int i = 1; i <= n; i ++) cin >> p[i];
build(1,1,n);
for(int i = 1; i <= m; i ++)
{
int op; cin >> op;
if(op == 1)
{
int x, y, k;
cin >> x >> y >> k;
update(x,y,1,n,1,k);
}
if(op == 2)
{
int x, y;
cin >> x >> y;
int sum = query(x,y,1,n,1);
cout << sum <<'\n';
}
}
}