#include<bits/stdc++.h>
using namespace std;
long long a[100005];
int n,m;
struct s{
long long data,lazy;
int lc,rc;
}tree[400005];
void pushdown(int mark)
{
if(tree[mark].lazy)
{
int l,r;
l=mark<<1;r=(mark<<1|1);
tree[l].lazy+=tree[mark].lazy;
tree[r].lazy+=tree[mark].lazy;
tree[l].data+=((long long)(tree[l].rc-tree[l].lc+1))*(tree[mark].lazy);
tree[r].data+=((long long)(tree[r].rc-tree[r].lc+1))*(tree[mark].lazy);
tree[mark].lazy=0;
}
}
void build(int mark,int l,int r)
{
tree[mark].lc=l;tree[mark].rc=r;
if(l==r){tree[mark].data=a[l];return;}
int mid;mid=(l+r)>>1;
build(mark<<1,l,mid);build(mark<<1|1,mid+1,r);
tree[mark].data=tree[mark<<1].data+tree[mark<<1|1].data;
// printf("%d %lld\n",mark,tree[mark].data);
}
void add(int mark,int x,int y,long long z)
{
int l,r;l=tree[mark].lc;r=tree[mark].rc;
pushdown(mark);
if(l>=x&&r<=y)
{
long long num;num=(r-l+1)*z;
tree[mark].data+=num;
tree[mark].lazy+=z;return;
}
int mid;mid=(l+r)>>1;
if(mid>=x)add(mark<<1,x,y,z);
if(mid+1<=y)add(mark<<1|1,x,y,z);
tree[mark].data=tree[mark<<1].data+tree[mark<<1|1].data;
}
long long find(int mark,int x,int y)
{
int l,r;l=tree[mark].lc;r=tree[mark].rc;
pushdown(mark);
if(l>=x&&r<=y)
{
// printf(" %d %d %lld\n",tree[mark].lc,tree[mark].rc,tree[mark].data);
return tree[mark].data;
}
int mid;mid=(l+r)>>1;
long long ans=0;
if(mid>=x)ans+=find(mark<<1,x,y);
if(mid+1<=y)ans+=find(mark<<1|1,x,y);
// printf(" %d %d %lld\n",tree[mark].lc,tree[mark].rc,ans);
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
for(register int i=1;i<=n;i++)scanf("%lld",&a[i]);
build(1,1,n);
// for(int i=1;i<=n;i++)printf("%lld\n",find(1,i,i));
for(register int i=1;i<=m;i++)
{
int op,x,y;long long z;scanf("%d",&op);
if(op==1)
{
scanf("%d%d%lld",&x,&y,&z);
add(1,x,y,z);
}
if(op==2)
{
scanf("%d%d",&x,&y);
printf("%lld\n",find(1,x,y));
}
// for(register int j=1;j<=n;j++)printf("%d ",find(1,j,j));printf("\n");
}
}