左偏树92pts求助!!!
查看原帖
左偏树92pts求助!!!
999658
talkwithcpp楼主2024/10/4 21:52
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

typedef long long ll;
struct node
{
	ll val, dist, id;
	ll fa, l, r;
}T[200010];

#define ls(x) T[x].l
#define rs(x) T[x].r
ll merge(ll x, ll y)//x,y为根节点指针
{
	//x一定是最后根
	if (!x || !y) return x | y;
	//保证小根堆
	if (T[x].val > T[y].val || (T[x].val == T[y].val && T[x].id > T[x].id)) swap(x, y);
	rs(x) = merge(rs(x), y);
	if (T[ls(x)].dist < T[rs(x)].dist) swap(ls(x), rs(x));
	T[x].dist = T[rs(x)].dist + 1;
	return x;
	//保证返回根节点
}

//fa赋为自己,当做并查集
ll find(ll x) { return T[x].fa == x ? x : T[x].fa = find(T[x].fa); }

ll n, m, val, k, a, b;
bool vis[200010];
int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);

	cin >> n >> m;

	for (int i = 1; i <= n; ++i)
	{
		cin >> val;
		T[i] = { val,1,i,i,0,0 };
	}

	for (int i = 1; i <= m; ++i)
	{
		cin >> k >> a;
		if (k == 1)
		{
			cin >> b;
			if (vis[a] || vis[b]) continue;
			a = find(a);
			b = find(b);
			if (a != b) T[a].fa = T[b].fa = merge(a, b);
		}
		else
		{
			if (vis[a]) { cout << "-1" << endl; continue; }
			a = find(a);
			vis[a] = 1;
			cout << T[a].val << endl;
			T[a].fa = T[ls(a)].fa = T[rs(a)].fa = merge(ls(a), rs(a));
		}
	}
	return 0;
}
2024/10/4 21:52
加载中...