#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAX=4*1e5+10;
inline int read()
{
char qwqc=getchar();
int qwqf=1,qwqx=0;
while(qwqc<'0'||qwqc>'9')
{
if(qwqc=='-') qwqf=-1;
qwqc=getchar();
}
while(qwqc>='0'&&qwqc<='9')
{
qwqx=(qwqx<<3)+(qwqx<<1)+(qwqc^48);
qwqc=getchar();
}
return qwqf*qwqx;
}
struct node
{
int l,r;
ll w,th;
}tree[MAX];
inline void bl(int l,int r,int k)
{
tree[k].l=l,tree[k].r=r;
if(l==r)
{
tree[k].w=read();
return ;
}
int mid=(l+r)>>1;
bl(l,mid,k<<1);
bl(mid+1,r,k<<1|1);
tree[k].w=tree[k<<1].w+tree[k<<1|1].w;
}
inline void down(int k)
{
tree[k<<1].th+=tree[k].th;
tree[k<<1|1].th+=tree[k].th;
tree[k<<1].w+=tree[k].th*(tree[k<<1].r-tree[k<<1].l+1);
tree[k<<1|1].w+=tree[k].th*(tree[k<<1|1].r-tree[k<<1|1].l+1);
tree[k].th=0;
}
inline ll ask(int x,int y,int k,ll ans)
{
if(tree[k].l>=x&&tree[k].r<=y)
{
ans+=tree[k].w;
return ans;
}
if(tree[k].th) down(k);
int mid=(tree[k].l+tree[k].r)>>1;
if(y<=mid) ask(x,y,k<<1,ans);
if(x>mid) ask(x,y,k<<1|1,ans);
}
inline void change(int x,int y,ll f,int k)
{
if(tree[k].l>=x&&tree[k].r<=y)
{
tree[k].w+=(tree[k].r-tree[k].l+1)*f;
tree[k].th+=f;
return ;
}
if(tree[k].th) down(k);
int mid=(tree[k].l+tree[k].r)>>1;
if(y<=mid) change(x,y,f,k<<1);
if(x>mid) change(x,y,f,k<<1|1);
tree[k].w=tree[k<<1].w+tree[k<<1|1].w;
}
int main()
{
int n=read(),m=read();
bl(1,n,1);
for(int i=1;i<=4*n;i++)
cout<<tree[i].w<<" ";
for(int i=1;i<=m;i++)
{
int pmh=read(),x=read(),y=read();
if(pmh==1)
{
int k=read();
change(x,y,k,1);
}
if(pmh==2) cout<<ask(x,y,1,0)<<endl;
}
return 0;
}