题目描述:
雾。
题目分析:
这个SB博主又在水题了。。。
左偏树维护一个小根堆
题目链接:
Ac 代码:
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
const int maxm=1100000;
int fa[maxm],rt[maxm],n,m;
int kill[maxm];
int find(int x)
{
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
struct Left_tree{
int son[maxm][2],dis[maxm],siz[maxm],val[maxm];
inline int merge(int x,int y)
{
if(!x||!y) return x+y;
if(val[x]>val[y]) std::swap(x,y);
son[x][1]=merge(son[x][1],y);
if(dis[son[x][0]]<dis[son[x][1]]) std::swap(son[x][0],son[x][1]);
dis[x]=dis[son[x][1]]+1;
siz[x]=siz[son[x][0]]+siz[son[x][1]]+1;
return x;
}
inline int pop(int x)
{
return merge(son[x][0],son[x][1]);
}
}heap;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&heap.val[i]);
rt[i]=fa[i]=i;
}
scanf("%d",&m);
for(int i=1,u,v;i<=m;i++)
{
char s[10];
scanf("%s",s);
if(s[0]=='M')
{
scanf("%d%d",&u,&v);
if(kill[u]||kill[v]) continue;
int f1=find(u),f2=find(v);
if(f1==f2) continue;
fa[f2]=f1;
rt[f1]=heap.merge(rt[f1],rt[f2]);
}
else
{
scanf("%d",&u);
if(kill[u]) printf("0\n");
else
{
int f1=find(u);
printf("%d\n",heap.val[rt[f1]]);
kill[rt[f1]]=1;
rt[f1]=heap.pop(rt[f1]);
}
}
}
return 0;
}