#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
ll n,m,x,y,k,op;
ll number[N];
struct node{
ll left,right;
ll sum;
ll tag;
} tree[N<<2];
void push_up(ll rt){
tree[rt].sum=tree[rt<<1].sum+tree[rt<<1|1].sum;
}
inline void push_down(ll l,ll r,ll rt){
if (tree[rt].tag){
ll m=l+r>>1;
ll lson= rt<<1;
ll rson= rt<<1|1;
tree[lson].tag += tree[rt].tag;
tree[rson].tag += tree[rt].tag;
tree[lson].sum += tree[rt].tag * (tree[lson].right-tree[lson].left+1);
tree[rson].sum += tree[rt].tag * (tree[rson].right-tree[rson].left+1);
tree[rt].tag = 0;
}
}
void build_tree(ll a,ll b,ll rt){
tree[rt].tag=0;
tree[rt].left=a;
tree[rt].right=b;
if(a==b){
tree[rt].sum=number[a];
return ;
}
ll mid=a+b>>1;
build_tree(a,mid,rt<<1);
build_tree(mid+1,b,rt<<1|1);
push_up(rt);
}
void update(ll rt,ll a,ll b,ll num){
if(tree[rt].right<a || tree[rt].left>b) return ;
if(a<=tree[rt].left && tree[rt].right<=b){
tree[rt].sum+=num*(tree[rt].right-tree[rt].left+1);
tree[rt].tag+=num;
return ;
}
push_down(tree[rt].left,tree[rt].right,rt);
ll mid=tree[rt].left+tree[rt].right>>1;
if(a<=mid)
update(rt<<1,a,b,num);
if(mid<=b)
update(rt<<1|1,a,b,num);
push_up(rt);
return ;
}
ll query(ll rt,ll a,ll b){
if(a<=tree[rt].left && tree[rt].right<=b){
return tree[rt].sum;
}
ll mid=tree[rt].left+tree[rt].right>>1;
ll result=0;
push_down(rt,a,b);
if(a<=mid)
result+=query(rt<<1,a,mid);
if(mid<b)
result+=query(rt<<1|1,mid+1,b);
return result;
}
int main(){
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=n;i++) scanf("%lld",&number[i]);
build_tree(1,n,1);
while(m--){
scanf("%lld",&op);
scanf("%lld%lld",&x,&y);
if(op==1){
scanf("%lld",&k);
update(1,x,y,k);
}else if(op==2){
int ans=query(1,x,y);
printf("%lld\n",ans);
}
}
return 0;
}