qwq 讨论区里说到的错误感觉都写到了,如果没写的话我是傻逼,但是代码
// #pragma GCC optimize(1)
// #pragma GCC optimize(2)
// #pragma GCC optimize(3)
// #pragma GCC optimize("Ofast", "inline", "-ffast-math")
// #pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n, m, fa[N], dist[N], l[N], r[N], idx = 0, w[N];
bool del[N];
inline int find(int x)
{
return x == fa[x] ? x : fa[x] = find(fa[x]);
}
inline int get(int x)
{
w[++ idx] = x, dist[idx] = 1, fa[idx] = idx;
return idx;
}
inline bool cmp(int x, int y)
{
if(w[x] != w[y])
return w[x] < w[y];
return x < y;
}
inline int merge(int x, int y)
{
if(x == 0 or y == 0)
return x + y;
if(cmp(y, x))
swap(x, y);
r[x] = merge(r[x], y);
if(dist[r[x]] > dist[l[x]])
swap(l[x], r[x]);
dist[x] = dist[r[x]] + 1;
return x;
}
inline void update(int x, int y)
{
x = find(x), y = find(y);
if(del[x] or del[y] or x == y)
return ;
if(cmp(y, x))
swap(x, y);
fa[y] = x, merge(x, y);
return ;
}
inline int query(int x)
{
if(del[x])
return -1;
x = find(x), del[x] = true;
if(cmp(r[x], l[x]))
swap(l[x], r[x]);
fa[x] = l[x], fa[l[x]] = l[x], merge(l[x], r[x]);
return w[x];
}
int main()
{
scanf("%d %d", &n, &m);
for(int i(1), x;i <= n; ++ i)
scanf("%d", &x), get(x);
while(m -- )
{
int op, x, y;
scanf("%d", &op);
if(op == 1)
scanf("%d %d", &x, &y), update(x, y);
else if(op == 2)
scanf("%d", &x), printf("%d\n", query(x));
}
return 0;
}