Loading

左偏树

左偏树模板题

#include <bits/stdc++.h>

using namespace std;

const int N = 100010;

int v[N], l[N], r[N], dis[N];
bool del[N];

int fa[N];

int find(int x) {
	if (x == fa[x]) return x;
	return fa[x] = find(fa[x]);
}

int cmp(int a, int b) {
	if (v[a] == v[b]) return a > b;
	return v[a] > v[b];
}

int merge(int a, int b) {
	if ((!a) || (!b)) return a | b;
	if (cmp(a, b)) swap(a, b);
	
	r[a] = merge(r[a], b);
	if (dis[l[a]] < dis[r[a]]) swap(l[a], r[a]);
	dis[a] = dis[r[a]] + 1;
	return a;
}

int n, m;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	cin >> n >> m;
	for (int i = 1; i <= n; i++) cin >> v[i];
	for (int i = 1; i <= n; i++) fa[i] = i;
	
	int opt, a, b;
	while (m--) {
		cin >> opt;
		if (opt == 1) {
			cin >> a >> b;
			if (del[a] || del[b]) continue;
			a = find(a), b = find(b);
			fa[a] = fa[b] = merge(a, b);
		}
		else {
			cin >> a;
			if (del[a]) {
				cout << -1 << '\n';
				continue;
			}
			a = find(a);
			cout << v[a] << '\n';
			fa[l[a]] = fa[r[a]] = fa[a] = merge(l[a], r[a]);
			del[a] = true;
		}
	}
	return 0;
}
posted @ 2023-08-23 14:55  SunnyYuan  阅读(0)  评论(0编辑  收藏  举报