#include<bits/stdc++.h>
using namespace std;
struct Node{
int l,r,w,i,z,y;
}a[10000001];
int rot[1000001];
int w[1000001];
void read(int &x){
x=0;
int f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-'){
f=-f;
}
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x*=10;
x+=ch-'0';
ch=getchar();
}
x*=f;
}
int tot=0;
void New_tree(int l,int r,int p){
a[p].l=l;
a[p].r=r;
a[p].i=p;
if(l==r){
a[p].w=w[l];
return;
}
int mid=l+r>>1;
a[p].z=tot+1;
a[p].y=tot+2;
New_tree(l,mid,++tot);
New_tree(mid+1,r,++tot);
}
void New_Tree(int l,int r,int rot1,int rot2,int loc,int val){
int mid=l+r>>1;
a[rot2].l=l;
a[rot2].r=r;
if(l==r){
a[rot2].w=val;
return;
}
if(loc>mid){
a[rot2].z=a[rot1].z;
a[rot2].y=++tot;
New_Tree(mid+1,r,a[rot1].y,a[rot2].y,loc,val);
}
else{
a[rot2].y=a[rot1].y;
a[rot2].z=++tot;
New_Tree(l,mid,a[rot1].z,a[rot2].z,loc,val);
}
}
int find(int rot1,int l,int r,int loc){
int mid=l+r>>1;
if(a[rot1].l==a[rot1].r){
return rot1;
}
if(loc>mid){
return find(a[rot1].y,mid+1,r,loc);
}
else{
return find(a[rot1].z,l,mid,loc);
}
}
int dfs(int p){
if(a[p].z!=0){
dfs(a[p].z);
}
printf("%d ",a[p].w);
if(a[p].y!=0){
dfs(a[p].y);
}
}
int js=0;
int main(){
int n,m;
read(n);
read(m);
rot[0]=1;
for(int i=1;i<=n;i++){
scanf("%d",&w[i]);
}
New_tree(1,n,++tot);
for(int i=1;i<=m;i++){
int v,op,loc;
read(v);
read(op);
read(loc);
if(op==1){
int val;
read(val);
rot[++js]=++tot;
New_Tree(1,n,rot[v],rot[js],loc,val);
}
else{
printf("%d\n",a[find(rot[v],i,n,loc)].w);
}
}
return 0;
}