#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i,s,t) for(register ll i = s;i <= t;++i)
#define per(i,t,s) for(register ll i = t;i >= s;--i)
const ll N = 1e7 + 5;
struct node
{
ll val;
ll rnk;
bool operator < (const node& x)
const
{
if(val == x.val)
return rnk < x.rnk;
return val < x.val;
}
};
ll n;
ll q;
ll fa[N] = {};
ll ls[N] = {};
ll rs[N] = {};
ll dis[N] = {};
bitset <N> del;
node t[N];
inline ll read()
{
ll x = 0;
ll y = 1;
char c = getchar();
while(c < '0' || c > '9')
{
if(c == '-')
y = -y;
c = getchar();
}
while(c >= '0' && c <= '9')
{
x = (x << 3) + (x << 1) + (c ^ '0');
c = getchar();
}
return x * y;
}
inline void write(ll x)
{
if(x < 0)
{
putchar('-');
write(-x);
return;
}
if(x > 9)
write(x / 10);
putchar(x % 10 + '0');
}
inline ll find(ll x)
{
if(x == fa[x])
return x;
return fa[x] = find(fa[x]);
}
inline ll merge(ll x,ll y)
{
if(!x || !y)
return x + y;
if(t[x].val > t[y].val)
swap(x,y);
rs[x] = merge(rs[x],y);
if(dis[rs[x]] > dis[ls[x]])
swap(ls[x],rs[x]);
dis[x] = dis[rs[x]] + 1;
return x;
}
int main()
{
dis[0] = -1;
n = read();
q = read();
rep(i,1,n)
{
fa[i] = i;
t[i].rnk = i;
t[i].val = read();
}
rep(k,1,q)
{
ll opt = 0;
opt = read();
if(opt == 1)
{
ll x = 0;
ll y = 0;
x = read();
y = read();
if(del[x] || del[y])
continue;
x = find(x);
y = find(y);
if(x == y)
continue;
fa[x] = merge(x,y);
fa[y] = fa[x];
}
else if(opt == 2)
{
ll x = 0;
x = read();
if(del[x])
{
write(-1);
putchar('\n');
continue;
}
x = find(x);
write(t[x].val);
putchar('\n');
del[x] = true;
fa[x] = merge(ls[x],rs[x]);
fa[ls[x]] = fa[x];
fa[rs[x]] = fa[x];
ls[x] = 0;
rs[x] = 0;
dis[x] = 0;
}
}
return 0;
}
应该是-1的特判有问题,但调了好久蒟蒻真的调不动了,求大佬解救qwq