#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 100010;
int n, m, w[N];
struct node{
int l, r;
LL sum, add;
} tr[N * 4];
void pushup(int u){
tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
}
void pushdown(int u){
auto &t = tr[u], &l = tr[u << 1], &r = tr[u << 1 | 1];
if(t.add){
l.add += t.add, l.sum += (LL)(l.r - l.l + 1) * t.add;
r.add += t.add, r.sum += (LL)(r.r - r.l + 1) * t.add;
t.add = 0;
}
}
void build(int u, int l, int r){
if(l == r) tr[u] = {l ,r, w[r] - w[r - 1], 0};
else{
tr[u] = {l, r};
int mid = l + r >> 1;
build(u << 1, l, mid);
build(u << 1 | 1, mid + 1, r);
pushup(u);
}
}
void modify(int u, int l, int r, LL d){
if(tr[u].l >= l && tr[u].r <= r){
tr[u].sum += (LL)(tr[u].r - tr[u].l + 1) * d;
tr[u].add += d;
}
else{
pushdown(u);
int mid = tr[u].l + tr[u].r >> 1;
if(l <= mid) modify(u << 1, l ,r, d);
if(r > mid) modify(u << 1 | 1, l, r, d);
pushup(u);
}
}
LL query(int u, int l, int r){
if(tr[u].l >= l && tr[u].r <= r) return tr[u].sum;
pushdown(u);
int mid = tr[u].l + tr[u].r >> 1;
LL v;
if(l <= mid) v += query(u << 1, l, r);
if(r > mid) v += query(u << 1 | 1, l, r);
return v;
}
int main(){
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i ++ ) scanf("%d", &w[i]);
build(1, 1, n);
while(m -- ){
LL op, l, r, k, d;
scanf("%lld%lld", &op, &l);
if(op == 1){
scanf("%lld%lld%lld", &r, &k, &d);
modify(1, l, l, k);
modify(1, l + 1, r, d);
modify(1, r + 1, r + 1, -(k + (r - l) * d));
}
else printf("%lld\n", query(1, 1, l));
}
return 0;
}