#include<iostream>
#include<algorithm>
#define lc 2*k
#define rc 2*k+1
using namespace std;
typedef long long ll;
const int N=1e5+10;
ll n,m,a[N],x,y,z,q,sum;
struct node{
int l;
int r;
ll mx;
} tree[4*N];
void build(ll k,ll l,ll r)
{
tree[k].l=l;
tree[k].r=r;
if(l==r)
{
tree[k].mx=a[l];
return;
}
ll mid=(l+r)>>1;
build(lc,l,mid);
build(rc,mid+1,r);
tree[k].mx=tree[lc].mx+tree[rc].mx;
}
void add(ll k,ll l,ll r,ll v)
{
if(tree[k].l==tree[k].r)
{
tree[k].mx+=v;
return;
}
ll mid=(r+l)>>1;
if(l>mid) add(rc,l,r,v);
else if(r<=mid) add(lc,l,r,v);
else
{
add(lc,l,mid,v);
add(rc,mid+1,r,v);
}
tree[k].mx=tree[lc].mx+tree[rc].mx;
return;
}
ll query(ll k,ll l,ll r)
{
ll res=0;
if(tree[k].l>=l && tree[k].r<=r)
{
return tree[k].mx;
}
ll mid=(tree[k].l+tree[k].r)>>1;
if(l>mid) res+=query(rc,l,r);
else if(r<=mid) res+=query(lc,l,r);
else
{
res+=query(lc,l,mid);
res+=query(rc,mid+1,r);
}
return res;
}
int main()
{
cin >> n >> m;
for(int i=1;i<=n;i++) cin >> a[i];
build(1,1,n);
for(int i=1;i<=m;i++)
{
cin >> x;
if(x==1)
{
cin >> y >> z >> q;
add(1,y,z,q);
}
else if(x==2)
{
cin >> y >> z;
cout << query(1,y,z) << endl;
}
}
return 0;
}