用并查集和左偏树维护士兵的关系

Code

#include <cstdio>
#include <algorithm>
#define N 1000010
using namespace std; int n,m,fa[N];
bool gg[N]; int Find(int x){return x==fa[x]?x:fa[x]=Find(fa[x]);}
namespace Lt{
int l[N],r[N],v[N],d[N];
int merge(int x,int y){
if(!x||!y) return x+y;
if(v[x]>v[y]) swap(x,y);
r[x]=merge(r[x],y);
if(d[r[x]]>d[l[x]]) swap(l[x],r[x]);
d[x]=d[r[x]]+1;
return x;
}
inline int tp(int x){return v[x];}
inline void pop(int x){
fa[x]=merge(l[x],r[x]);
fa[fa[x]]=fa[x];
}
} inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
} int main(){
n=read();
for(int i=1;i<=n;++i) Lt::v[i]=read(),fa[i]=i;
m=read();
while(m--){
char ch;for(ch=getchar();ch!='M'&&ch!='K';ch=getchar());
if(ch=='K'){
int x=read(),p;
if(gg[x]) puts("0");
else{
gg[p=Find(x)]=1;
printf("%d\n",Lt::v[p]);
Lt::pop(p);
}
}else{
int x=read(),y=read();
if(gg[x]||gg[y]) continue;
int px=Find(x),py=Find(y);
if(px!=py) fa[px]=fa[py]=Lt::merge(px,py);
}
}
return 0;
}

最新文章

  1. MySql常用日期函数(转载)
  2. POJ2653判断直线是否相交
  3. SQL ServerOVER 子句,over开窗函数,SQL SERVER 开窗函数
  4. 利用开源框架Volley来下载文本和图片。
  5. SQL Server数据库学习笔记-E-R模型
  6. Tomcat的SessionID引起的Session Fixation和Session Hijacking问题
  7. [MODX] 1. Template *
  8. 在系统方法中调用navigationController的标准写法
  9. spark-shell 执行脚本并传入参数
  10. Javascript基础学习(3)_对象和数组
  11. Maven实战一
  12. 玩转html5(四)----使用canvas画一个时钟(可以动的哦!)
  13. easyui动力头 &amp;amp;&amp;amp; 动态加入tabs
  14. 将linux的HOME目录下的文件夹名字改回英文
  15. (九)UIScrollView和PageControl的分页
  16. Pocket Gem OA: Log Parser
  17. 初试fiddler
  18. Centos 7 下监控与告警部署
  19. Change position in observation
  20. 有道云笔记导入txt文件的方法

热门文章

  1. static final int DEFAULT_INITIAL_CAPACITY = 1 &lt;&lt; 4; // aka 16
  2. Third week-homework(员工管理系统)
  3. March 5 2017 Week 10 Sunday
  4. [原]Machine Learing 入门 —— 开门第0篇
  5. python 提取字符串中的数字组成新的字符串
  6. C++ decltype类型说明符(尾置返回类型使用)
  7. cf 786 B 线段树优化建图
  8. [luoguP3627][APIO2009]抢掠计划
  9. 【其它】Nook HD刷机
  10. C#实现打印