#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 10, MAXV = 1e8 + 10;
int n, m, rt[MAXN], a[MAXN], tr[MAXV], ls[MAXV], rs[MAXV], idx;
inline void pu(int x) { tr[x] = tr[ls[x]] + tr[rs[x]]; }
inline int clone(int x)
{
tr[++idx] = tr[x];
ls[idx] = ls[x];
rs[idx] = rs[x];
return idx;
}
void build(int &x, int l, int r)
{
if (!x) x = ++idx;
if (l == r)
{
tr[x] = a[l];
return;
}
int mid = (l + r) >> 1;
build(ls[x], l, mid);
build(rs[x], mid + 1, r);
pu(x);
}
int update(int x, int l, int r, int p, int v)
{
x = clone(x);
if (l == p && p == r)
{
tr[x] = v;
return x;
}
int mid = (l + r) >> 1;
if (p <= mid)
ls[x] = update(ls[x], l, mid, p, v);
else
rs[x] = update(rs[x], mid + 1, r, p, v);
pu(x);
return x;
}
int query(int x, int l, int r, int p)
{
if (l == p && p == r) return tr[x];
int mid = (l + r) >> 1;
if (p <= mid)
return query(ls[x], l, mid, p);
else
return query(rs[x], mid + 1, r, p);
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> a[i];
build(rt[0], 1, n);
for (int op, p, v, num, i = 1; i <= m; i++)
{
cin >> v >> op >> p;
if (op == 1)
{
cin >> num;
rt[i] = update(rt[v], 1, n, p, num);
}
else
{
cout << query(rt[v], 1, n, p) << '\n';
rt[i] = rt[v];
}
}
return 0;
}