#include <iostream>
#include <cstring>
#include <algorithm>
#define INF 0x3f3f3f3f
#define lowbit(x) -x&x
using namespace std;
typedef long long LL;
const int N = 1e6 + 10;
LL tr[N], a[N];
int n, q;
void add(int i, int z){
for (; i <= n; i += lowbit(i))
tr[i] += z;
}
LL ask(int i){
LL res = 0;
for (; i; i -= lowbit(i))
res += tr[i];
return res;
}
int main(){
scanf("%d%d", &n, &q);
for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
for (int i = 1; i <= n; i ++ )
add(i, a[i] - a[i - 1]);
while (q -- ){
int op;
scanf("%d", &op);
if (op == 1){
int l, r, x;
scanf("%d%d%d", &l, &r, &x);
add(l, x), add(r + 1, -x);
}else{
int i;
scanf("%d", &i);
printf("%lld\n", ask(i));
}
}
return 0;
}
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<cstdio>
#define lowbit(x) -x&x
#define LL long long
using namespace std;
const int N = 1e6 + 10;
LL n, m;
LL tr1[N],tr2[N];
void add(LL i,LL z){
for(LL j = i; j <= n; j += lowbit(j))
tr1[j] += z, tr2[j] += i * z;
}
LL sum(LL i){
LL ans1 = 0;
LL ans2 = 0;
for(LL j = i; j; j -= lowbit(j)){
ans1 += (i + 1) * tr1[j];
ans2 += tr2[j];
}
return ans1 - ans2;
}
int main(){
LL x, last = 0;
scanf("%lld",&n);
scanf("%lld",&m);
for(int i = 1; i <= n; i ++ ){
scanf("%lld",&x);
add(i, x - last);
last = x;
}
LL op, l, r;
for(int i = 0; i < m; i ++ ){
scanf("%lld",&op);
if(op == 1){
scanf("%lld%lld%lld", &l, &r, &x);
add(l, x);
add(r + 1, -x);
}
else{
scanf("%lld%lld", &l, &r);
printf("%lld\n", sum(r) - sum(l-1));
}
}
return 0;
}
#include <iostream>
#include <cstring>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
const int N = 1e6 + 10;
struct Node{
int l, r;
LL add, v;
}tr[N << 2];
int n, q;
int a[N];
void pu(int u){
tr[u].v = tr[u << 1].v + tr[u << 1 | 1].v;
}
void pd(int u){
if (tr[u].add){
tr[u << 1].add += tr[u].add;
tr[u << 1 | 1].add += tr[u].add;
tr[u << 1].v += tr[u].add * (LL)(tr[u << 1].r - tr[u << 1].l + 1);
tr[u << 1 | 1].v += tr[u].add * (LL)(tr[u << 1 | 1].r - tr[u << 1 | 1].l + 1);
tr[u].add = 0;
}
}
void build(int u, int l, int r){
tr[u] = {l, r, 0, 0};
if (l == r){
tr[u].v = a[l];
return;
}
int mid = l + r >> 1;
build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
pu(u);
}
void modify(int u, int l, int r, int z){
if (tr[u].l >= l && tr[u].r <= r){
tr[u].add += z;
tr[u].v += (LL)(tr[u].r - tr[u].l + 1) * z;
return;
}
pd(u);
int mid = tr[u].l + tr[u].r >> 1;
if (l <= mid) modify(u << 1, l, r, z);
if (r > mid) modify(u << 1 | 1, l, r, z);
pu(u);
}
LL query(int u, int l, int r){
if (tr[u].l >= l && tr[u].r <= r)
return tr[u].v;
pd(u);
int mid = tr[u].l + tr[u].r >> 1;
LL res = 0;
if (l <= mid) res += query(u << 1, l, r);
if (r > mid) res += query(u << 1 | 1, l, r);
return res;
}
int main(){
scanf("%d%d", &n, &q);
for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
build(1, 1, n);
while (q -- ){
int op, l, r, x;
scanf("%d", &op);
if (op == 1){
scanf("%d%d%d", &l, &r, &x);
modify(1, l, r, x);
}else{
scanf("%d%d", &l, &r);
printf("%lld\n", query(1, l, r));
}
}
return 0;
}