#include<bits/stdc++.h>
using namespace std;
const int N=5e3+7;
typedef long long ll;
int n;
ll lable[N];
class Binary_Line_Tree{
public:
void check_output(){
for(int i=1;i<=tot+4;i++){
printf("id:%d %d~%d:%d(%d)\n",i,k[i].left_lim,k[i].right_lim,k[i].sum,k[i].lazytag);
}
}
void build_tree(ll place,ll l,ll r){
++tot;
k[place].left_lim=l;
k[place].right_lim=r;
if(l==r){
k[place].sum=lable[l];
return;
}
ll mid=(l+r)>>1;
build_tree(left_son(place),l,mid);
build_tree(right_son(place),mid+1,r);
k[place].sum=k[left_son(place)].sum+k[right_son(place)].sum;
}
void add_tree_double(int place,int l,int r,int add_num){
if(be_in_check(l,r,k[place].left_lim)&&be_in_check(l,r,k[place].right_lim)==true){
k[place].sum+=add_num*(k[place].right_lim-k[place].left_lim+1);
k[place].lazytag+=add_num;
return;
}
push_down(left_son(place));
if(be_in_check(l,r,k[left_son(place)].left_lim)||be_in_check(l,r,k[left_son(place)].right_lim)){
add_tree_double(left_son(place),l,r,add_num);
}
if(be_in_check(l,r,k[right_son(place)].left_lim)||be_in_check(l,r,k[right_son(place)].right_lim)){
add_tree_double(right_son(place),l,r,add_num);
}
k[place].sum=k[left_son(place)].sum+k[right_son(place)].sum;
}
ll search_tree_double(ll place,ll l,ll r){
if(be_in_check(l,r,k[place].left_lim)&&be_in_check(l,r,k[place].right_lim)==true){
return k[place].sum;
}
if((be_in_check(k[place].left_lim,k[place].right_lim,l)||be_in_check(k[place].left_lim,k[place].right_lim,r))==false){
return 0;
}
push_down(place);
ll ans=0;
if(be_in_check(l,r,k[left_son(place)].left_lim)||be_in_check(l,r,k[left_son(place)].right_lim)==true){
ans+=search_tree_double(left_son(place),l,r);
}
if(be_in_check(l,r,k[right_son(place)].left_lim)||be_in_check(l,r,k[right_son(place)].right_lim)==true){
ans+=search_tree_double(right_son(place),l,r);
}
return ans;
}
private:
struct tree_node{
int left_lim,right_lim,sum,lazytag;
}k[N*4];
ll left_son(ll x){return x*2;}
ll right_son(ll x){return x*2+1;}
ll tot=0;
bool be_in_check(ll l,ll r,ll asked){
return (asked>=l)&&(asked<=r);
}
void push_down(ll place){
if(k[place].lazytag==0)return;
k[left_son(place)].lazytag+=k[place].lazytag;
k[right_son(place)].lazytag+=k[place].lazytag;
k[left_son(place)].sum+=k[place].lazytag*(k[left_son(place)].right_lim-k[left_son(place)].left_lim+1);
k[right_son(place)].sum+=k[place].lazytag*(k[right_son(place)].right_lim-k[right_son(place)].left_lim);
k[place].lazytag=0;
return;
}
};
int main(){
int m,op,x,k,y;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%lld",&lable[i]);
Binary_Line_Tree tree;
tree.build_tree(1,1,n);
while(m--){
tree.check_output();
scanf("%d",&op);
if(op==1){
scanf("%d%d%d",&x,&y,&k);
tree.add_tree_double(1,x,y,k);
}else{
scanf("%d%d",&x,&y);
ll ans=tree.search_tree_double(1,x,y);
printf("%lld\n",ans);
}
}
return 0;
}