#include<bits/stdc++.h>
using namespace std;
struct NODE
{
int son[2],val,dis,rt;
bool exist;
}node[100010];
int merge(int x,int y)
{
if(x*y==0)return x+y;
if(node[x].val>node[y].val||(node[x].val==node[y].val&&x>y))swap(x,y);
node[x].son[1]=merge(y,node[x].son[1]);
if(node[node[x].son[0]].dis<node[node[x].son[1]].dis)swap(node[x].son[0],node[x].son[1]);
node[x].dis=node[node[x].son[1]].dis+1;
return x;
}
int _find(int x){if(node[x].rt!=x)node[x].rt=_find(node[x].rt);return node[x].rt;}
int main()
{
node[0].dis=-1;
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){scanf("%d",&node[i].val);node[i].dis=0;node[i].exist=1;node[i].rt=i;}
int op,x,y;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&op,&x);
if(op==1)
{
scanf("%d",&y);
if(!(node[x].exist||node[x].exist))continue;
x=_find(x);y=_find(y);
if(x==y)continue;
node[x].rt=node[y].rt=merge(x,y);
}
else
{
if(!node[x].exist){printf("-1\n");continue;}
x=_find(x);
printf("%d\n",node[x].val);
node[x].exist=0;
int t1=node[x].son[0],t2=node[x].son[1];
node[t1].rt=node[t2].rt=node[x].rt=merge(t1,t2);
node[x].son[0]=node[x].son[1]=node[x].dis=0;
}
}
}
```cpp