#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a[1000001];
ll read()
{
bool flag=0;
char ch=getchar();
ll ans=0;
while(!isdigit(ch) && ~ch)
{
flag|=(ch=='-');
ch=getchar();
}
while(isdigit(ch) && ~ch)
{
ans=(ans<<1)+(ans<<3)+(ch^48);
ch=getchar();
}
return flag ? -ans : ans;
}
int _c[100];
void write(ll x)
{
int i=0;
bool flag=0;
if(x<0) {x=-x;putchar('-');}
if(x==0) putchar('0');
while(x) {_c[++i]=x%10;x/=10;}
while(i) {putchar(_c[i--]^48);}
}
struct node{
ll v,lc,rc,lt,rt;
};
ll trsz=-1;
node tree[40000000];
vector<ll> root;
ll build_first(ll l,ll r){
node temp;
trsz++;
tree[trsz]=temp;
ll ret;
ret=trsz;
tree[ret].lt=l;
tree[ret].rt=r;
if(l==r){
tree[ret].v=a[l];
return ret;
}
tree[ret].lc=build_first(l,(l+r)/2);
tree[ret].rc=build_first((l+r)/2+1,r);
return ret;
}
ll vis(ll k,ll now){
if(tree[now].lt!=tree[now].rt){
if(k<=tree[tree[now].lc].rt){
return vis(k,tree[now].lc);
}
else{
return vis(k,tree[now].rc);
}
}
else{
return tree[now].v;
}
}
void change(ll former,ll now,ll k,ll nv){
if(tree[now].lt==tree[now].rt){
tree[now].v=nv;
return ;
}
else{
if(k<=(tree[now].lt+tree[now].rt)/2){
tree[now].rc=tree[former].rc;
node t1;
t1=tree[tree[former].lc];
trsz++;
tree[trsz]=t1;
tree[now].lc=trsz;
change(tree[former].lc,tree[now].lc,k,nv);
}
else{
tree[now].lc=tree[former].lc;
node t1;
t1=tree[tree[former].rc];
trsz++;
tree[trsz]=t1;
tree[now].rc=trsz;
change(tree[former].rc,tree[now].rc,k,nv);
}
}
}
int main(){
ll n,m,t1,t2,t3,t4;
n=read();
m=read();
for(ll i=0;i<n;i++){
a[i]=read();
}
ll trash=build_first(0,n-1);
root.push_back(0);
for(;m;m--){
t1=read();
t2=read();
if(t2==1){
cin>>t3>>t4;
trsz++;
tree[trsz]=tree[root[t1]];
root.push_back(trsz);
change(root[t1],root[root.size()-1],t3-1,t4);
}
else{
cin>>t3;
trsz++;
tree[trsz]=tree[root[t1]];
root.push_back(trsz);
write(vis(t3-1,root[t1]));
putchar('\n');
}
}
}