#include
using namespace std;
const int maxn = 2e5 + 10;
typedef long long ll;
ll segment_tree[3 * maxn], lazy[3 * maxn], a[maxn];
int n;
void build_tree(int L, int R, int pos) {
if(L == R) {
segment_tree[pos] = a[L];
}
else {
int middle = (L + R) / 2;
build_tree(L, middle, 2 * pos);
build_tree(middle + 1, R, 2 * pos + 1);
segment_tree[pos] = segment_tree[2 * pos] + segment_tree[2 * pos + 1];
}
}
void update(int L, int R, int pos, int i, int j, ll value) {
if(lazy[pos] > 0) {
segment_tree[pos] += lazy[pos] * (R - L + 1);
if(L != R) {
lazy[2 * pos] += lazy[pos];
lazy[2 * pos + 1] += lazy[pos];
}
lazy[pos] = 0;
}
// L R i L R j L R
if(R < i or j < L) {
return;
}
if(i <= L and R <= j) {
segment_tree[pos] += value * (R - L + 1);
if(L != R) {
lazy[2 * pos] += value;
lazy[2 * pos + 1] += value;
}
}
else {
int middle = (L + R) / 2;
update(L, middle, 2 * pos, i, j, value);
update(middle + 1, R, 2 * pos + 1, i, j, value);
segment_tree[pos] = segment_tree[2 * pos] + segment_tree[2 * pos + 1];
}
}
ll query(int L, int R, int pos, int i, int j) {
if(lazy[pos] > 0) {
segment_tree[pos] += lazy[pos] * (R - L + 1);
if(L != R) {
lazy[2 * pos] += lazy[pos];
lazy[2 * pos + 1] += lazy[pos];
}
lazy[pos] = 0;
}
// L R i L R j L R
if(R < i or j < L) {
return 0;
}
if(i <= L and R <= j) {
return segment_tree[pos];
}
int middle = (L + R) / 2;
return query(L, middle, 2 * pos, i, j) + query(middle + 1, R, 2 * pos + 1, i, j);
}
int main()
{
ios_base::sync_with_stdio(false);
int q;
cin >> n >> q;
for(int i = 0; i < n; i++) {
cin >> a[i];
}
build_tree(0, n - 1, 1);
for(int i = 0; i < q; i++) {
int type;
cin >> type;
if(type == 1) {
int x, y, u;
cin >> x >> y >> u;
update(0, n - 1, 1, x - 1, y - 1, u);
}
else {
int x;
cin >> x;
cout << query(0, n - 1, 1, x - 1, x - 1) << endl;
}
}
return 0;
}