#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+9;
const int M = 2e7+9;
int P=0;
int dat[N];
int lc[M],rc[M];
int val[M];
//int P,rt[N],lc[M],rc[M],val[M];
char I[M<<1],O[M],*fi=I,*fo=O;
bool nega;
inline void in(int &z)
{
while(*fi<'-')++fi;
if(*fi=='-')nega=1,++fi;
z=*fi++&15;
while(*fi>'-')z*=10,z+=*fi++&15;
if(nega)nega=0,z=-z;
}
void oi(int z)
{
if(z>9)oi(z/10);
*fo++=z%10|'0';
}
inline void out(int z)
{
z>0?oi(z):(*fo++='-',oi(-z));*fo++='\n';
}//上面快读快写
void Build(int &t,int l,int r){
t=++P;
if(l!=r){
int mid=(l+r)>>1;
Build(lc[t],l,mid);
Build(rc[t],mid+1,r);
}
else{
in(val[t]);
}
}
void insert(int *t,int p,int l,int r,int k){
while(l<r){
*t=++P;
int mid=(l+r)>>1;
if(k<=mid){
r=mid;
rc[*t]=rc[p];t=&lc[*t];p=lc[p];
}
else {
l=mid+1;
lc[*t]=lc[p];t=&rc[*t];p=rc[p];
}
}
in(val[*t=++P]);
}
void query(int t,int l,int r,int k){
while(l<r){
int mid=(l+r)>>1;
if(k<=mid){
r=mid;
t=lc[t];
}
else{
l=mid+1;
t=rc[t];
}
}
out(val[t]);
}
int main(){
int n,m;
fread(I,1,sizeof(I),stdin);
in(n);in(m);
Build(dat[0],1,n);
for(int i=1;i<=m;i++){
int a,b,c;
in(a),in(b),in(c);
if(b==1){
insert(&dat[i],dat[a],1,n,c);
}
else {
query(dat[a],1,n,c);
dat[i]=++P;
lc[P]=lc[dat[a]];
rc[P]=rc[dat[a]];
}
}
fwrite(O,1,fo-O,stdout);
return 0;
}