解题思路:
用并查集维护左偏树(可并堆)中每个节点的根节点即可。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int getint()
{
int i=0,f=1;char c;
for(c=getchar();(c<'0'||c>'9')&&c!='-';c=getchar());
if(c=='-')f=-1,c=getchar();
for(;c>='0'&&c<='9';c=getchar())i=(i<<3)+(i<<1)+c-'0';
return i*f;
}
const int N=1000005;
int n,m;
int lc[N],rc[N],dis[N],val[N],fa[N];
bool dead[N];
char s[2];
int find(int x)
{
return fa[x]==x?x:fa[x]=find(fa[x]);
}
int merge(int x,int y)
{
if(!x)return y;
if(!y)return x;
if(val[x]>val[y])swap(x,y);
rc[x]=merge(rc[x],y);
if(dis[rc[x]]>dis[lc[x]])swap(lc[x],rc[x]);
dis[x]=dis[rc[x]]+1;
return x;
}
int main()
{
//freopen("lx.in","r",stdin);
n=getint();
for(int i=1;i<=n;i++)
val[i]=getint(),fa[i]=i;
m=getint();
while(m--)
{
scanf("%s",s);
if(s[0]=='M')
{
int x=getint(),y=getint();
if(dead[x]||dead[y])continue;
x=find(x),y=find(y);
if(x!=y)fa[x]=fa[y]=merge(x,y);
}
else
{
int x=getint();
if(dead[x])puts("0");
else
{
x=find(x);dead[x]=1;
cout<<val[x]<<'\n';
fa[x]=merge(lc[x],rc[x]);
fa[fa[x]]=fa[x];
}
}
}
}