左偏树51pts求调
查看原帖
左偏树51pts求调
666796
Rainsleep楼主2023/4/10 23:25

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;
} 
2023/4/10 23:25
加载中...