样例RE,但AC
查看原帖
样例RE,但AC
532130
yanhuorenjian楼主2024/8/12 17:26

抽象

#include<iostream>
#include<cstring>
#define int long long
using namespace std;
struct node
{
	int lc,rc,dis,fa,s,id;bool flag;
}t[100005];
int m,n,rt;
int merge(int x,int y)
{
	if(!x||!y)return x+y;
	if(t[x].s>t[y].s||(t[x].s==t[y].s&&t[x].id>t[y].id))swap(x,y);
	t[x].rc=merge(t[x].rc,y);
	t[t[x].rc].fa=x;
	if(t[t[x].lc].dis<t[t[x].rc].dis)swap(t[x].lc,t[x].rc);
	t[x].dis=t[t[x].rc].dis+1;
	return x;
}
int find(int x)
{
	if(x==t[x].fa)return x;
	return t[x].fa=find(t[x].fa);
}
signed main()
{
	scanf("%d%d",&n,&m);
	t[0].dis=-1;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&t[i].s);
		t[i].fa=i;
		t[i].flag=false;
		t[i].id=i;
	}
	for(int i=1;i<=m;i++)
	{
		int a,b,opt;
		scanf("%d%d",&opt,&a);
		if(opt==1)
		{
			scanf("%d",&b);
			if(t[a].flag==true||t[b].flag==true)continue;
			a=find(a);b=find(b);
			if(a!=b)t[a].fa=t[b].fa=merge(a,b);
		}
		else
		{
			if(t[a].flag==true)
			{
				cout<<-1<<endl;
				continue;
			}
			a=find(a);
			t[a].flag=true;
			cout<<t[a].s<<endl;
			t[t[a].lc].fa=t[a].fa=t[t[a].rc].fa=merge(t[a].lc,t[a].rc);
			t[a].lc=t[a].rc=0;
		}
	}
	return 0;
}
2024/8/12 17:26
加载中...