#include <bits/stdc++.h>
#define N 100005
using namespace std;
struct node
{
int l,r,sum,tag;
}bit[N*4];
int n,m,in[N];
int ls(int p) {return p<<1;}
int rs(int p) {return p<<1|1;}
void push_down(int p)
{
bit[ls(p)].tag+=bit[p].tag;
bit[rs(p)].tag+=bit[p].tag;
bit[p].tag=0;
bit[ls(p)].sum+=(bit[ls(p)].r-bit[ls(p)].l+1)*bit[ls(p)].tag;
bit[rs(p)].sum+=(bit[ls(p)].r-bit[ls(p)].l+1)*bit[rs(p)].tag;
}
void push_up(int p)
{
bit[p].sum=bit[ls(p)].sum+bit[rs(p)].sum;
}
void build(int p,int l,int r)
{
bit[p].l=l,bit[p].r=r;
if (l==r)
{
bit[p].sum=in[(l+r)/2];
return ;
}
int mid=(l+r)/2;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
bit[p].sum=bit[ls(p)].sum+bit[rs(p)].sum;
}
int quary(int p,int l,int r)
{
if (bit[p].l>r||bit[p].r<l) return 0;
if (bit[p].l>=l&&bit[p].r<=r) return bit[p].sum;
push_down(p);
return quary(ls(p),l,r)+quary(rs(p),l,r);
}
void update(int p,int l,int r,int val)
{
if (bit[p].l>r||bit[p].r<l) return ;
if (bit[p].l>=l&&bit[p].r<=r)
{
bit[p].tag+=val;
bit[p].sum+=(bit[p].r-bit[p].l+1)*bit[p].tag;
return ;
}
push_down(p);
update(ls(p),l,r,val);
update(rs(p),l,r,val);
push_up(p);
}
int main()
{
cin>>n>>m;
for (int i=1;i<=n;i++)
{
cin>>in[i];
}
build(1,1,n);
for (int i=1;i<=m;i++)
{
int opt,x,y,val;
cin>>opt;
if (opt==1)
{
cin>>x>>y>>val;
update(1,x,y,val);
}
else
{
cin>>x>>y;
cout<<quary(1,x,y)<<"\n";
}
}
return 0;
}