#include<bits/stdc++.h>
using namespace std;
struct node{
int ls,rs,val,s;
} t[100001];
int fa[100001],n,m,rt[100001];
void update(int id){
t[id].s=t[t[id].rs].s+1;
}
int merge(int x,int y){
if(!x or !y){
return x+y;
}
if(t[x].val>t[y].val){
swap(x,y);
}
t[x].rs=merge(t[x].rs,y);
if(t[t[x].ls].s<t[t[x].rs].s){
swap(t[x].ls,t[x].rs);
}
update(x);
return x;
}
int find(int k){
if(fa[k]==k) return k;
else return fa[k]=find(fa[k]);
}
void unionset(int x,int y){
fa[find(x)]=y;
return;
}
int del[100001];
int main(){
cin>>n>>m;
t[0].s=-1;
for(int i=1;i<=n;i++){
int tmp;
cin>>t[i].val;
t[i]={0,0,t[i].val,0};
fa[i]=i;
rt[i]=i;
}
while(m--){
int op,x,y;
cin>>op>>x;
if(op==1){
cin>>y;
int p=find(x),q=find(y);
if(p != q){
fa[p]=y;
rt[p] = merge(rt[p], rt[q]);
}
}else{
int p=find(x);
if(!del[x]) cout<<t[rt[p]].val<<endl;
else cout<<"-1\n";
del[x]=1;
merge(t[x].ls,t[x].rs);
}
}
return 0;
}