#include<stdio.h>
#include<iostream>
#include<cstring>
using namespace std;
const long long maxn=1000000*3;
struct node{
long long left,right,mid,sum,tag;
}tree[maxn];
void build(long long num,long long l,long long r){
tree[num].left=l;
tree[num].right=r;
tree[num].mid=(l+r)/2;
if (r>l){
build(num*2,tree[num].left,tree[num].mid);
build(num*2+1,tree[num].mid+1,tree[num].right);
}
}
void add(long long num,long long x,long long d){
if (tree[num].left== tree[num].right)tree[num].sum+=d;
else{
if (x<=tree[num].mid) add(2*num,x,d);
else add(2*num+1,x,d);
tree[num].sum=tree[2*num].sum+tree[2*num+1].sum;
}
}
long long find(long long num,long long l,long long r){
long long ans=0;
if(l<=tree[num].left&&tree[num].right<=r) return tree[num].sum;
else{
if(l<=tree[num].mid) ans+=find(2*num,l,r);
if(r>tree[num].mid) ans+=find(2*num+1,l,r);
return ans;
}
}
int main(){
long long q[maxn];
long long a,x,y,k,n,m,z,s=0;
memset(tree,0,sizeof(tree));
cin>>n>>m;
build(1,1,n);
for(long long i=1;i<=n;i++){
cin>>z;
add(1,i,z);
}
for(long long i=1;i<=m;i++){
cin>>a>>x>>y;
if (a==1) {
cin>>k;
for(long long j=x;j<=y;j++) add(1,j,k);
}
else {
s++;
q[s]=find(1,x,y);
}
}
for(long long i=1;i<=s;i++)
cout<<q[i]<<endl;
return 0;
}