配对堆板子,WA65
#include <cstdio>
#include <algorithm>
#define N 100010
#define fo(i, a, b) for (int i = a; i <= b; ++i)
using namespace std;
struct node
{
int w, id, ch, br;
}ph[N];
int fa[N], bz[N];
int find(int a)
{
if (fa[a] != a)
fa[a] = find(fa[a]);
return fa[a];
}
int merge(int a, int b)
{
if (!a) return a;
if (!b) return b;
if (ph[b].w < ph[a].w || (ph[b].w == ph[a].w && ph[b].id < ph[a].id))
swap(a, b);
ph[b].br = ph[a].ch;
ph[a].ch = b;
int fb = find(b), ff = find(a);
fa[fb] = fa[ff];
return a;
}
int merges(int x)
{
if (!x || !ph[x].br)
return x;
int a = ph[x].br;
int b = ph[a].br;
ph[a].br = ph[x].br = 0;
fa[a] = a; fa[x] = x;
return merge(merge(x, a), merges(b));
}
int main()
{
// freopen("lg.in", "r", stdin);
// freopen("lg.out", "w", stdout);
int n, m;
scanf("%d%d", &n, &m);
fo (i, 1, n)
{
scanf("%d", &ph[i].w);
ph[i].id = i;
fa[i] = i;
}
fo (i, 1, m)
{
int op;
scanf("%d", &op);
if (op == 1)
{
int x, y;
scanf("%d%d", &x, &y);
int fx = find(x), fy = find(y);
if (!bz[x] && !bz[y] && fx != fy)
merge(fx, fy);
}
else
{
int x;
scanf("%d", &x);
if (!bz[x])
{
int fx = find(x);
printf("%d\n", ph[fx].w);
bz[fx] = 1;
fa[fx] = ph[fx].ch;
fa[ph[fx].ch] = ph[fx].ch;
merges(ph[fx].ch);
}
else
printf("-1\n");
}
}
return 0;
}