题目连接:https://www.luogu.org/problemnew/show/P3377

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 300001 + 10;
struct Left_Tree{
int val, fa, son[2], dis;
}h[maxn<<2];
int n, m;
int Merge(int r1, int r2)
{
if(r1 == 0 || r2 == 0) return r1 + r2;
if(h[r1].val > h[r2].val) swap(r1, r2);
h[r1].son[1] = Merge(h[r1].son[1], r2);
h[h[r1].son[1]].fa = r1;
if(h[h[r1].son[0]].dis < h[h[r1].son[1]].dis) swap(h[r1].son[0], h[r1].son[1]);
h[r1].dis = h[h[r1].son[1]].dis + 1;
return r1;
}
void destory(int r1)
{
h[r1].val = -1;
h[h[r1].son[0]].fa = h[h[r1].son[1]].fa = 0;
Merge(h[r1].son[0], h[r1].son[1]);
}
int find(int x)
{
while(h[x].fa)
x = h[x].fa;
return x;
}
int main()
{
scanf("%d%d",&n,&m);
//h[0].dis = -1;
for(int i = 1; i <= n; i++)
scanf("%d",&h[i].val);
for(int i = 1; i <= m; i++)
{
int opt, x, y;
scanf("%d",&opt);
if(opt == 1)
{
scanf("%d%d",&x,&y);
if(h[x].val == -1 || h[y].val == -1) continue;
int t1 = find(x), t2 = find(y);
if(t1 != t2)
Merge(t1, t2);
}
else
{
scanf("%d",&x);
if(h[x].val == -1) printf("-1\n");
else
{
int t1 = find(x);
printf("%d\n",h[t1].val);
destory(t1);
}
}
}
return 0;
}

最新文章

  1. 通过javascript在网页端生成zip压缩包并下载
  2. CodeForces 489A (瞎搞) SwapSort
  3. ios存储 plist 偏好设置 自定义对象存储
  4. (转载)CentOS: 开放80、22、3306端口操作
  5. Switch Case语句中多个值匹配同一个代码块的写法
  6. SQL Server -SET NOCOUNT
  7. ThinkPHP 类似Yii的Gii生成Model的功能。
  8. ADB logcat 过滤方法(抓取日志)
  9. 【Java GUI】Java面板基础:JPanel
  10. linux vim编辑
  11. 【转】awk内置变量
  12. String 类的实现(2)引用计数与写时拷贝
  13. spring boot、cloud v2.1.0.RELEASE 使用及技术整理
  14. 阿里云服务器用smtp发送邮件返失败
  15. 配置文件schema约束
  16. Linux,ubuntu14.04.5下安装软件
  17. MongoDB Replica Set搭建集群
  18. Spring Cloud体系介绍
  19. WPF学习资源整理
  20. AutoHotKey入门

热门文章

  1. 资料收集:学习 Linux/*BSD/Unix 的 30 个最佳在线文档
  2. BNU34058——干了这桶冰红茶!——————【递推】
  3. 【Xshell】设置XShell最大的显示行数
  4. 5、Angular2 Injectable 服务
  5. 02.List泛型集合
  6. 06.do-while循环的练习
  7. C# 在窗体的子线程中创建新窗体
  8. Android滑动删除功能
  9. drupal对数据库操作
  10. fireworks图片边缘化 fireworks羽化图片边缘的教程