#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll N = 1e5+9;
struct Node
{
ll son[2];
ll dist;
ll val;
}t[N];
ll pre[N],a[N];
bitset<N> vis;
ll find(ll x){return (pre[x] == x?x:pre[x] = find(pre[x]));}
ll &rs(ll x)
{
return t[x].son[(t[t[x].son[1]].dist>t[t[x].son[0]].dist)];
}
ll merge(ll x,ll y)
{
if(!x||!y) return x|y;
if(t[x].val>t[y].val) swap(x,y);
ll &rson = rs(x);
rson = merge(rson,y);
t[x].dist = t[rson].dist+1;
return x;
}
void erase(ll x)
{
ll y = merge(t[x].son[0],t[x].son[1]);
pre[t[x].son[0]] = y;
pre[t[x].son[1]] = y;
pre[x] = y;
t[t[x].son[0]].dist = 0;
t[t[x].son[1]].dist = 0;
t[x].dist = 0;
}
void solve()
{
ll n,m;cin>>n>>m;
for(int i = 1;i<=n;i++)
{
cin>>t[i].val;
pre[i] = i;
}
while(m--)
{
ll op,x,y;cin>>op>>x;
if(op == 1)
{
cin>>y;
if(vis[x]||vis[y]) continue;
x = find(x);y = find(y);
if(x!=y) pre[x] = pre[y] = merge(x,y);
}
else
{
if(vis[x])
{
cout<<-1<<"\n";
continue;
}
x = find(x);
cout<<t[x].val<<"\n";
vis[x] = 1;
erase(find(x));
}
}
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int _ = 1;
while(_--){solve();}
return 0;
}