#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
struct node
{
ll val, dist, id;
ll fa, l, r;
}T[200010];
#define ls(x) T[x].l
#define rs(x) T[x].r
ll merge(ll x, ll y)
{
if (!x || !y) return x | y;
if (T[x].val > T[y].val || (T[x].val == T[y].val && T[x].id > T[x].id)) swap(x, y);
rs(x) = merge(rs(x), y);
if (T[ls(x)].dist < T[rs(x)].dist) swap(ls(x), rs(x));
T[x].dist = T[rs(x)].dist + 1;
return x;
}
ll find(ll x) { return T[x].fa == x ? x : T[x].fa = find(T[x].fa); }
ll n, m, val, k, a, b;
bool vis[200010];
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; ++i)
{
cin >> val;
T[i] = { val,1,i,i,0,0 };
}
for (int i = 1; i <= m; ++i)
{
cin >> k >> a;
if (k == 1)
{
cin >> b;
if (vis[a] || vis[b]) continue;
a = find(a);
b = find(b);
if (a != b) T[a].fa = T[b].fa = merge(a, b);
}
else
{
if (vis[a]) { cout << "-1" << endl; continue; }
a = find(a);
vis[a] = 1;
cout << T[a].val << endl;
T[a].fa = T[ls(a)].fa = T[rs(a)].fa = merge(ls(a), rs(a));
}
}
return 0;
}