#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN =2 * 1e5 + 5;
int tree[4 * MAXN] , a[MAXN];
int n , m;
inline int read() {
int s = 0, w = 1;
char ch = getchar();
while(! isdigit(ch)) {
if(ch == '-') {
w = -1;
}
ch = getchar();
}
while(isdigit(ch)){
s = (s << 1) + (s << 3) + (ch ^ 48);
ch = getchar();
}
return s * w;
}
void pushup(int cur){
tree[cur] = tree[2 * cur] + tree[2 * cur + 1];
return ;
}
void build(int cur , int lt , int rt){
if(lt == rt){
tree[cur] = a[lt];
return ;
}
int mid = (lt + rt) >> 1;
build(2 * cur , lt , mid);
build(2 * cur + 1 , mid + 1 , rt);
pushup(cur);
return ;
}
void update(int cur , int lt , int rt , int qx , int qy , int val){
if(qy < lt || rt < qx){
return ;
}
if(lt == rt && qx <= lt && lt <= qy){
tree[cur] += val;
return ;
}
int mid = (lt + rt) >> 1;
update(2 * cur , lt , mid , qx , qy , val);
update(2 * cur + 1 , mid + 1 , rt , qx , qy , val);
pushup(cur);
return ;
}
int query(int cur , int lt , int rt , int qx , int qy){
if(qy < lt || rt < qx){
return 0;
}
if(qx <= lt && rt <= qy){
return tree[cur];
}
int mid = (lt + rt) >> 1;
int left = query(2 * cur , lt , mid , qx , qy);
int right = query(2 * cur + 1 , mid + 1 , rt , qx , qy);
return left + right;
}
signed main () {
n = read();
m = read();
for(int i = 1;i <= n;i ++){
a[i] = read();
}
build(1 , 1 , n);
int sum = a[1];
for(int i = 1;i <=m;i ++){
int l;
l = read();
if(l == 1){
int lt , rt , k;
cin >> lt >> rt >> k;
if(lt == 1){
sum += k;
update(1 , 1 , n , lt + 1, rt , k);
}else
update(1 , 1 , n , lt, rt , k);
}else if(l == 2){
int k;
k = read();
sum += k;
}else if(l == 3){
int k;
k = read();
sum -= k;
}else if(l == 4){
int lt , rt;
lt = read();
rt = read();
if(lt == 1){
int key = query(1 , 1 , n , lt + 1, rt);
printf("%lld \n", key + sum);
}else{
int key = query(1 , 1 , n , lt, rt);
printf("%lld \n", key);
}
}else{
printf("%lld\n", sum);
}
}
return 0;
}