#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define int long long
const int N=5e5+10;
int n,m;
struct yee
{
int l,r;
int v,lazy;
}f[4*N];
int left(int rt)
{
return 2*rt;
}
int right(int rt)
{
return 2*rt+1;
}
void push_up(int rt)
{
f[rt].v=f[left(rt)].v+f[right(rt)].v;
}
void push_down(int rt)
{
int l=f[left(rt)].l,r=f[left(rt)].r,lazy=f[rt].lazy;
f[left(rt)].v+=(r-l+1)*lazy;
l=f[right(rt)].l,r=f[right(rt)].r;
f[right(rt)].v+=(r-l+1)*lazy;
f[left(rt)].lazy+=lazy;
f[right(rt)].lazy+=lazy;
f[rt].lazy=0;
}
void build(int rt,int l,int r)
{
f[rt].l=l;
f[rt].r=r;
f[rt].lazy=f[rt].v=0;
if(l==r)
return;
int mid=(l+r)/2;
build(left(rt),l,mid);
build(right(rt),mid+1,r);
}
void add(int rt,int ql,int qr,int v)
{
int l=f[rt].l,r=f[rt].r;
int mid=(l+r)/2;
if(ql<=l&&r<=qr)
{
f[rt].v+=(r-l+1)*v;
f[rt].lazy+=v;
return;
}
push_down(rt);
if(mid>=ql)
add(left(rt),ql,qr,v);
if(mid+1<=qr)
add(right(rt),ql,qr,v);
push_up(rt);
}
int find(int rt,int ql,int qr)
{
int l=f[rt].l,r=f[rt].r,ans=0;
int mid=(l+r)/2;
if(ql<=l&&r<=qr)
return f[rt].v;
if(ql<=mid)
ans+=find(left(rt),ql,qr);
if(mid+1<=qr)
ans+=find(right(rt),ql,qr);
push_up(rt);
return ans;
}
signed main()
{
scanf("%lld %lld",&n,&m);
build(1,1,n);
for(int i=1;i<=n;i++)
{
int a;
scanf("%lld",&a);
add(1,i,i,a);
}
while(m--)
{
int o,op,p,p1=0;
scanf("%lld %lld %lld",&o,&op,&p);
if(o==1)
{
scanf("%d",&p1);
add(1,op,p,p1);
}
else
printf("%lld\n",find(1,op,p));
}
return 0;
}