51pts 求调
查看原帖
51pts 求调
822718
DELA楼主2023/9/18 13:48

rt

#include <iostream>
using namespace std;
int v[100005], TLE[100005], WA[100005], f[100005], rt[100005];
bool del[100005];
int merge(int x, int y) {
	if (!x || !y) return x+y;
	if (v[x] < v[y]) return WA[y] = TLE[x], TLE[x] = y, x; else return WA[x] = TLE[y], TLE[y] = x, y;
}
int merges(int x) {
	if (!x && !WA[x]) return x;
	int t = WA[WA[x]];
	WA[x] = WA[WA[x]] = 0;
	return merge(merge(x, WA[x]), merges(t));
}
int find(int x) {
	return f[x] == x? x: f[x] = find(f[x]);
}
int main() {
	int n, m, op, x, y, t;
	cin >> n>> m;
	for (int i=1; i<=n; i++) cin >> v[i], f[i] = i, rt[i] = i;
	for (int i=1; i<=m; i++) {
		cin >> op>> x;
		if (op == 1) cin >> y, t = merge(rt[find(x)], rt[find(y)]), f[find(x)] = find(y), rt[find(x)] = t; else cout << (del[x] ? -1 : v[rt[find(x)]]) << endl, del[rt[find(x)]] = true, rt[find(x)] = merges(TLE[rt[find(x)]]);
	}
}
2023/9/18 13:48
加载中...