#include<stdio.h>
int arr[100000];
int tree[400000];
void build_tree(int arr[],int tree[],int node,int start,int end){
if(start == end)
tree[node] = arr[start];
else{
int mid = (start+end)/2;
int left_node = 2*node;
int right_node = 2*node+1;
build_tree(arr,tree,left_node,start,mid);
build_tree(arr,tree,right_node,mid+1,end);
tree[node] = tree[left_node]+tree[right_node];
}
}
void update_tree(int arr[],int tree[],int node,int start,int end,int idx,int val){
if(start==end){
arr[idx] += val;
tree[node] += val;
}
else{
int mid = (start+end)/2;
int left_node = 2*node;
int right_node = 2*node+1;
if(idx>=start&&idx<=mid){
update_tree(arr,tree,left_node,start,mid,idx,val);
}
else{
update_tree(arr,tree,right_node,mid+1,end,idx,val);
}
tree[node] = tree[left_node]+tree[right_node];
}
}
// 求arr中[L,R]的和
int query_tree(int arr[],int tree[],int node,int start,int end,int L,int R){
if(R<start || L>end)
return 0;
else if(L<= start&&end<=R)
return tree[node];
else if(start==end)
return tree[node];
int mid = (start+end)/2;
int left_node = 2*node;
int right_node = 2*node+1;
int sum_left = query_tree(arr,tree,left_node,start,mid,L,R);
int sum_right = query_tree(arr,tree,right_node,mid+1,end,L,R);
return sum_left+sum_right;
}
int main(){
int m,n;
scanf("%d%d",&n,&m);
for(int i = 0;i < n;i++){
scanf("%d",&arr[i]);
}
build_tree(arr,tree,1,0,n-1);
for(int i = 0;i < m ;i++){
int ops;
scanf("%d",&ops);
if(ops == 1){
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
for(int idx = x-1;idx<=y-1;idx++)
update_tree(arr,tree,1,0,n-1,idx,k);
}
else{
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",query_tree(arr,tree,1,0,n-1,x-1,y-1));
}
}
return 0;
}