#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mid ((l + r) >> 1)
#define endl '\n'
struct node {
ll sum, toadd;
int lc, rc;
node(int _l = 0, int _r = 0, ll s = 0, ll t = 0) :lc(_l), rc(_r), sum(s), toadd(t) {}
};
vector<node>tr;
vector<int> root;
int n, m, tot = 1;
void pull_up(int idx) {
tr[idx].sum = tr[tr[idx].lc].sum + tr[tr[idx].rc].sum;
}
void change(int copy, int idx, int l, int r, int target, ll val) {
if (l == r) {
tr[idx].sum = val;
return;
}
tr[idx].lc = tr[copy].lc;
tr[idx].rc = tr[copy].rc;
if (target <= mid) {
tr[idx].lc = ++tot;
change(tr[copy].lc, tr[idx].lc, l, mid, target, val);
} else {
tr[idx].rc = ++tot;
change(tr[copy].rc, tr[idx].rc, mid + 1, r, target, val);
}
}
void change(int ver, int target, ll val) {
root.push_back(++tot);
change(root[ver], root.back(), 1, n, target, val);
}
ll ask(int idx, int l, int r, int target) {
if (l == r) {
if (l != target)
cerr << "error" << endl;
return tr[idx].sum;
}
if (target <= mid)
return ask(tr[idx].lc, l, mid, target);
else
return ask(tr[idx].rc, mid + 1, r, target);
}
ll ask(int ver, int target) {
return ask(root[ver], 1, n, target);
}
void init() {
cin >> n >> m;
vector<ll> tmp(n + 1);
tr.resize(n * 30);
root.push_back(tot);
for (int i = 1; i <= n; i++)
cin >> tmp[i];
function<void(int, int, int)> build = [&](int idx, int l, int r) -> void {
if (l == r) {
tr[idx].sum = tmp[l];
return;
}
tr[idx].lc = ++tot;
tr[idx].rc = ++tot;
build(tr[idx].lc, l, mid);
build(tr[idx].rc, mid + 1, r);
pull_up(idx);
};
build(1, 1, n);
}
int main() {
FILE *stream;
freopen_s(&stream, "P3919_6.in", "r", stdin);
freopen_s(&stream, "out.txt", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(nullptr); cout.tie(nullptr);
init();
for (int i = 1; i <= m; i++) {
int ver, opt, idx;
cin >> ver >> opt >> idx;
if (opt == 1) {
int val; cin >> val;
change(ver, idx, val);
} else {
ll tmp = ask(ver, idx);
cout << tmp << endl;
root.push_back(root.back());
if (tmp == -418986049)
cerr << i << " " << ver << " " << idx << endl;
}
}
}