#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
const int N=4567898;
ll a[N],ans[N],tag[N];
ll k,n,m;
ll ltree(ll root);
ll rtree(ll root);
void push_up(ll root);
void push_down(ll root,ll left_,ll right_);
void build(ll root,ll left_,ll right_);
void add(ll left_,ll right_,ll root,ll k);
ll query(ll qul,ll qur,ll left_,ll right_,ll root);
void work(ll addl,ll addr,ll left_,ll right_,ll root,ll k);
int main()
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
build(1,1,n);
ll flag,l,r;
for(int i=1;i<=m;i++)
{
scanf("%lld%lld%lld",&flag,&l,&r);
switch(flag)
{
case 1:
{
scanf("%lld",&k);
work(l,r,1,n,1,k);
break;
}
case 2:
{
printf("%lld\n",query(l,r,1,n,1));
break;
}
}
}
return 0;
}
void work(ll addl,ll addr,ll left_,ll right_,ll root,ll k)
{
if(addl<=left_&&addr>=right_)
{
tag[root]+=k;
ans[root]+=k*(right_-left_+1);
return ;
}
push_down(root,left_,right_);
ll mid=(left_+right_)/2;
if(addl<=mid)
work(addl,addr,left_,mid,ltree(root),k);
if(addr>mid)
work(addl,addr,mid+1,right_,rtree(root),k);
push_up(root);
}
void build(ll root,ll left_,ll right_)
{
tag[root]=0;
if(left_==right_)
{
ans[root]=a[left_];
return ;
}
ll mid=(left_+right_)/2;
build(ltree(root),left_,mid);
build(rtree(root),mid+1,right_);
push_up(root);
return ;
}
ll ltree(ll root)
{
return root<<1;
}
ll rtree(ll root)
{
return root<<1|1;
}
void push_up(ll root)
{
ans[root]=ans[ltree(root)]+ans[rtree(root)];
return;
}
void push_down(ll root,ll left_,ll right_)
{
ll mid=(left_+right_)/2;
add(left_,mid,ltree(root),tag[root]);
add(mid+1,right_,rtree(root),tag[root]);
tag[root]=0;
return;
}
void add(ll left_,ll right_,ll root,ll k)
{
tag[root]+=k;
ans[root]+=k*(right_-left_+1);
return;
}
ll query(ll qul,ll qur,ll left_,ll right_,ll root)
{
if(qul<=left_&&qur>=right_)
return ans[root];
ll s=0;
ll mid=(left_+right_)/2;
push_down(root,left_,right_);
if(qul<=mid)
s+=query(qul,qur,left_,mid,ltree(root));
if(qur>=mid)
s+=query(qul,qur,mid+1,right_,rtree(root));
return s;
}