#include <iostream>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <streambuf>
#include <string>
#include <valarray>
#include <variant>
#include <vector>
#include <math.h>
#include <stdint.h>
#include <stdio.h>
using namespace std;
const int maxx=1e3;
int a[maxx];
int tree[4*maxx],lazy[4*maxx];
void push_up(int node){
tree[node]=tree[2*node]+tree[2*node+1];
}
void push_down(int node,int start,int end){
if(lazy[node]){
int mid=(end-start)/2;
lazy[2*node]+=lazy[node];
lazy[2*node+1]+=lazy[node];
tree[2*node]+=tree[node]*(mid-start+1);
tree[2*node+1]+=tree[node]*(end-mid);
lazy[node]=0;
}
}
void build(int node,int start,int end){
if(start==end){
tree[node]=a[start];
return ;
}
int mid=(end-start)/2;
build(2*node,start,mid);
build(2*node+1,mid+1,end);
tree[node]=tree[2*node]+tree[2*node+1];
}
int findd(int node,int start,int end,int l,int r){
if(l<=start && end<=r){
return tree[node];
}
int mid=(end-start)/2;
int ans_left=findd(2*node,start,mid,l,r);
int ans_right=findd(2*node+1,mid+1,end,l,r);
return ans_left+ans_right;
}
void update(int node,int start,int end,int l,int r,int val){
if(start>=l && end<=r){
lazy[node]+=val;
tree[node]+=val*(end-start+1);
return ;
}
push_down(node,start,end);
int mid=(end-start)/2;
if(l<=mid){
update(2*node,start,mid,l,r,val);
}
if(r>mid){
update(2*node+1,mid+1,end,l,r,val);
}
push_up(node);
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
for(int i=0;i<m;i++){
short ord;
cin>>ord;
if(ord==1){
int x,y,val;
cin>>x>>y>>val;
update (1,1,n,x,y,val);
}
else{
int x,y;
cin>>x>>y;
int ans=findd(1,1,n,x,y);
cout<<ans<<endl;
}
}
}