配对堆 44pts 玄关求调
查看原帖
配对堆 44pts 玄关求调
922679
hongshixiaobai楼主2024/12/10 16:27
#include<bits/stdc++.h>
using namespace std;
int top[100005],br[100005],sn[100005],vl[100005],vis[100005],i,op,j,u,v,w,tmp,n,m;
int find(int u)
{
	if(top[u] == u)return u;
	else return top[u] = find(top[u]);
}
int mer(int x,int y)
{
	if(!x||!y)return x|y;
	if(vl[x]>vl[y])x^=y^=x^=y;
	br[y] = sn[x],sn[x] = y,top[y] = x;
	return x;
}
int merge(int u)
{
	if(u == 0||br[u] == 0)return u;
	v = br[u],w = br[v],br[u] = br[v] = 0;
	return top[u] = top[v] = mer(merge(w),mer(u,v));
}
int del(int u)
{
	return top[sn[u]] = merge(sn[u]);
}
int main()
{
	cin>>n>>m;
	for(i = 1;i<=n;i++)
		cin>>vl[i],top[i] = i;
	while(m--)
	{
		cin>>op;
		if(op&1)
		{
			cin>>u>>v;
			if(!vis[u]&&!vis[v])
			{
				u = find(u),v = find(v);
				if(u!=v)top[u] = mer(u,v);
			}
		}
		else 
		{
			cin>>u;
			if(!vis[u])u = find(u),vis[u] = 1,cout<<vl[u]<<'\n',del(u);
			else cout<<"-1\n";
		}
	}
} 
2024/12/10 16:27
加载中...