#include<iostream>
#include<map>
#include<vector>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#include<set>
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define drep(a,b,c) for(int a=b;a>=c;a--)
#define all(a) a.begin(),a.end()
#define ai_jiang signed main()
#define int long long
using namespace std;
typedef long long ll;
using poly = vector<ll>;
namespace ai {
constexpr int N = 1e6+5;
int n,q,ver,op,l,r,rt[N<<1],tot,vv;
struct node {
int v,s[2];
} tr[(int)(3e7)+5];
#define lc(x) tr[x].s[0]
#define rc(x) tr[x].s[1]
void modify(int x,int &y,int l,int r,int pos,int v) {
y=++tot; tr[y]=tr[x]; tr[y].v=v;
if(l==r) return;
int mid=l+((r-l)>>1);
if(pos<=mid) modify(lc(x),lc(y),l,mid,pos,v);
else modify(rc(x),rc(y),mid+1,r,pos,v);
}
int query(int x,int l,int r,int pos) {
if(l==r) return tr[x].v;
int mid=l+((r-l)>>1);
if(pos<=mid) return query(lc(x),l,mid,pos);
else return query(rc(x),mid+1,r,pos);
}
}
using namespace ai;
ai_jiang {
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(false);
cin>>n>>q;
rep(i,1,n) cin>>vv,modify(rt[i-1],rt[i],1,n,i,vv);
rep(i,n+1,n+q) {
cin>>ver>>op>>l;
if(op==1) {
cin>>r;
modify(rt[ver+n],rt[i],1,n,l,r);
} else {
cout<<query(rt[ver+n],1,n,l)<<'\n';
rt[i]=rt[ver+n];
}
}
return 0;
}