#include <bits/stdc++.h>
using namespace std;
typedef pair <int, int> pii;
typedef long long ll;
#define rep(i, x, y) for (int i = (x); i <= (y); ++i)
#define per(i, x, y) for (int i = (x); i >= (y); --i)
int read () {
int res = 0;
bool f = false;
char temp = getchar();
for (; !isdigit(temp); temp = getchar()) f = temp == '-';
for (; isdigit(temp); temp = getchar()) res = res * 10 + temp - '0';
if (f) return -res;
return res;
}
char gc () {
char temp = getchar();
while (temp == '\n' || temp == '\r' || temp == ' ') temp = getchar();
return temp;
}
constexpr int maxn = 1e6 + 105;
struct NODE {
NODE *lk, *rk;
int id, num;
} *root = new NODE;
NODE *version[maxn];
int val[maxn], l[maxn << 1], r[maxn << 1], cnt, cc = 1;
void build (NODE *u) {
auto &ln = l[u->id], &rn = r[u->id];
if (ln == rn) return u->num = val[ln], void();
int mid = (ln + rn) >> 1;
u->lk = new NODE, u->rk = new NODE;
u->lk->id = ++cc, l[cc] = l[u->id], r[cc] = mid;
u->rk->id = ++cc, l[cc] = mid + 1, r[cc] = r[u->id];
build(u->lk), build(u->rk);
}
void modify (NODE *u, NODE *nu, int x, int y) {
auto &ln = l[u->id], &rn = r[u->id];
if (ln == rn && ln == x) return nu->num = y, void();
int mid = (ln + rn) >> 1;
if (x <= mid) {
nu->rk = u->rk, nu->lk = new NODE;
nu->lk->id = u->lk->id;
modify(u->lk, nu->lk, x, y);
} else {
nu->lk = u->lk, nu->rk = new NODE;
nu->rk->id = u->rk->id;
modify(u->rk, nu->rk, x, y);
}
}
int query (NODE *u, int x) {
auto &ln = l[u->id], &rn = r[u->id];
if (ln == rn && ln == x) return u->num;
int mid = (ln + rn) >> 1;
if (x <= mid) return query(u->lk, x);
else return query(u->rk, x);
}
int n, m;
signed main () {
n = read(), m = read();
rep (i, 1, n) val[i] = read();
version[0] = root;
root->id = 1;
l[1] = 1, r[1] = n;
build(root);
rep (i, 1, m) {
int v = read(), op = read(), x = read();
if (op == 1) {
version[i] = new NODE{nullptr, nullptr, 1};
modify(version[v], version[i], x, read());
} else {
version[i] = version[v];
printf("%d\n", query(version[v], x));
}
}
return 0;
}