#include<bits/stdc++.h>
using namespace std;
#define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++)
#define ll long long
#define lrt int l,int r,int rt
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define root l,r,rt
#define mst(a,b) memset((a),(b),sizeof(a))
#define pii pair<int,int>
#define fi first
#define se second
#define mk(x,y) make_pair(x,y)
const int maxn=1e5+100;
const int lz=0;
const ll INF=1e18;
struct node{
int l,r,fa;
int val,dis;
}ltt[maxn];
#define ls(x) ltt[x].l
#define rs(x) ltt[x].r
int merge(int x,int y){
if(!x||!y) return x+y;
if(ltt[x].val>ltt[y].val||(ltt[x].val==ltt[y].val&&x>y))
swap(x,y);
rs(x)=merge(rs(x),y);
ltt[rs(x)].fa=x;
if(ltt[ls(x)].dis<ltt[rs(x)].dis)
swap(ls(x),rs(x));
ltt[x].dis=ltt[rs(x)].dis+1;
return x;
}
void pop(int x){
ltt[x].val=-1;
ltt[ls(x)].fa=ls(x);
ltt[rs(x)].fa=rs(x);
ltt[x].fa=merge(ls(x),rs(x));
}
int find(int x){
return x==ltt[x].fa?x:ltt[x].fa=find(ltt[x].fa);
}
int n,m;
int main(){
ios::sync_with_stdio(false);
cin>>n>>m;
ltt[0].dis=-1;
rep(i,1,n+1){
cin>>ltt[i].val;
ltt[i].fa=i;
}
while(m--){
int op,x,y;
cin>>op;
if(op==1){
cin>>x>>y;
if(ltt[x].val==-1) continue;
if(ltt[y].val==-1) continue;
int fx=find(x),fy=find(y);
if(fx==fy) continue;
ltt[fx].fa=ltt[fy].fa=merge(fx,fy);
}else{
cin>>x;
if(ltt[x].val==-1) cout<<"-1\n";
else{
x=find(x);
cout<<ltt[x].val<<"\n";
pop(x);
}
}
}
return 0;
}