#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e5+10;
inline int read()
{
int s=0,b=1; char c=getchar();
while(c<'0'||c>'9') {if(c=='-') b=-1; c=getchar();}
while(c>='0'&&c<='9') s=(s<<3)+(s<<1)+(c&15),c=getchar();
return s*b;
}
int fa[N],v[N],ls[N],rs[N],dep[N];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
int merge(int x,int y)//合并
{
if(!x||!y) return x+y;
if(v[x]>v[y]) swap(x,y);
rs[x]=merge(rs[x],y);
if(dep[ls[x]]<dep[rs[x]]) swap(ls[x],rs[x]);
fa[ls[x]]=fa[rs[x]]=fa[x]=x,dep[x]=dep[rs[x]]+1;
return x;
}
void pop(int x)//出
{
v[x]=-1;
fa[ls[x]]=ls[x],fa[rs[x]]=rs[x];
fa[x]=merge(ls[x],rs[x]);
return ;
}
int n,m,opt,x,y;
int main()
{
n=read(); m=read();
for(int i=1;i<=n;i++)
scanf("%d",&v[i]),fa[i]=i;
//dep[0]=-1;
while(m--)
{
opt=read();
if(opt==1)
{
x=read(),y=read();
if(v[x]!=-1&&v[y]!=-1)
{
int p=find(x),q=find(y);
if(p!=q) fa[p]=fa[q]=merge(p,q);
}
}
else
{
x=read();
if(v[x]==-1) printf("-1\n");
else printf("%d\n",v[find(x)]),pop(find(x));
}
}
return 0;
}