#include<bits/stdc++.h>
using namespace std;
const int maxN=4000010;
int stp,tot,a[maxN],c[maxN],lb[maxN],rb[maxN],ls[maxN],rs[maxN],loc[maxN];
void pushup(int k){
c[k]=max(c[ls[k]],c[rs[k]]);
}
void build(int l,int r,int k){
lb[k]=l,rb[k]=r;
if(l==r){
c[k]=a[l];
return;
}
int mid=(l+r)/2;
ls[k]=++stp;
build(l,mid,stp);
rs[k]=++stp;
build(mid+1,r,stp);
pushup(k);
}
void update(int l,int r,int x,int v,int k,int k0){
lb[k]=l,rb[k]=r;
if(l==r){
c[k]=v;
return;
}
int mid=(l+r)/2;
if(x<=mid){
ls[k]=++stp;
rs[k]=rs[k0];
update(l,mid,x,v,stp,ls[k0]);
} else {
ls[k]=ls[k0];
rs[k]=++stp;
update(mid+1,r,x,v,stp,rs[k0]);
}
pushup(k);
}
int query(int x,int k){
if(lb[k]==rb[k]) return c[k];
int mid=(lb[k]+rb[k])/2;
if(x<=mid) return query(x,ls[k]);
else return query(x,rs[k]);
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
//stp=loc[0]=0;
build(1,n,stp);
for(int i=1;i<=m;i++){
int id,opt,x,v;
cin>>id>>opt;
if(opt==1){
loc[++tot]=++stp;
cin>>x>>v;
update(1,n,x,v,stp,loc[id]);
} else {
cin>>x;
tot++;
loc[tot]=loc[tot-1];
cout<<query(x,loc[id])<<endl;
}
}
return 0;
}
3AC 5WA 3TLE 1RE