#include <iostream>
#include<queue>
#include <cstring>
#define MAX_LEN 400000
using namespace std;
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 +1;
int right_node = 2* node +2;
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 +1;
int right_node = 2 * node +2;
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];
}
}
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];
}
else{
int mid = (start +end) /2;
int left_node = 2 * node +1;
int right_node = 2 * node +2;
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 arr[100001]{0};
int size,N;
int tree[MAX_LEN] = {0};
queue<int> q;
cin>>size;
cin>>N;
for(int i=0;i<size;i++){
cin>>arr[i];
}
for(int i=1;i<=N;i++){
int t;
cin>>t;
build_tree(arr,tree,0,0,size-1);
if(t==2){
int a,b;
cin>>a>>b;
q.push(query_tree(arr ,tree,0,0, size-1 ,a-1,b-1));
}else if(t==1){
int a,b,c;
cin>>a>>b>>c;
for(int j=a-1;j<=b-1;j++)
update_tree(arr , tree , 0 , 0 , size-1 , j , c);
}
}
for(;q.front();){
cout<<q.front()<<endl;
q.pop();
}
return 0;
}