struct tree{
int l,r,w,tage;
}t[N];
void push_up(int u) {
t[u].w=t[u*2].w+t[u*2+1].w;
}
void push_down(int u) {
t[u*2].w+=(t[u*2].r-t[u*2].l+1)*t[u].tage;
t[u*2+1].w+=(t[u*2+1].r-t[u*2+1].l+1)*t[u].tage;
t[u*2].tage+=t[u].tage;
t[u*2+1].tage+=t[u].tage;
t[u].tage=0;
}
void build(int u,int l,int r) {
t[u].l=l;t[u].r=r;
if (l==r) {
t[u].w=a[l];
return;
}
int mid=(l+r)/2;
build(u*2,l,mid);
build(u*2+1,mid+1,r);
push_up(u);
}
void update(int u,int l,int r,int v) {
if (t[u].l>=l&&t[u].r<=r) {
t[u].w+=(t[u].r-t[u].l+1)*v;
t[u].tage+=v;
return;
}
push_down(u);
int mid=(t[u].l+t[u].r)/2;
if (l<=mid) update(u*2,l,r,v);
if (r>mid) update(u*2+1,l,r,v);
push_up(u);
}
int query(int u,int l,int r) {
if (t[u].l>=l&&t[u].r<=r) {
return t[u].w;
}
push_down(u);
int ans=0;
int mid=(t[u].l+t[u].r)/2;
if (l<=mid) ans+=query(u*2,l,r);
if (r>mid) ans+=query(u*2+1,l,r);
return ans;
}
int n,m;
int a[N];
int main() {
cin>>n>>m;
for (int i=1;i<=n;++i) {
cin>>a[i];
}
build(1,1,n);
while (m--) {
int opt;
cin>>opt;
if (opt==1) {
int x,y,k;
cin>>x>>y>>k;
update(1,x,y,k);
}
else {
int x,y;
cin>>x>>y;
cout<<query(1,x,y)<<endl;
}
}
}