## 头文件:
```cpp
#include <bits/extc++.h>
```
# 堆篇:
建议使用
```cpp
__gnu_pbds::priority_queue<int,greater<int> ,__gnu_pbds::pairing_heap_tag> q;
```
有以下常用的函数:
```cpp
push,
pop,
top,
size,
join
```
## 可并堆模板:
```cpp
#include<bits/stdc++.h>
#include<bits/extc++.h>
using namespace std;
bool vis[1919810];
int f[1919810];
int find(int x){
if(f[x]==x){
return x;
}
return f[x]=find(f[x]);
}
void merge(int x,int y){
if(find(x)==find(y)){
return;
}
f[find(x)]=find(y);
}
__gnu_pbds::priority_queue<pair<int,int>,greater<pair<int,int> > ,__gnu_pbds::pairing_heap_tag> q[1919810];
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
f[i]=i;
}
for(int i=1;i<=n;i++){
int x;
cin>>x;
q[i].push(make_pair(x,i));
}
for(int i=1;i<=m;i++){
int opt;
cin>>opt;
if(opt==1){
int x,y;
cin>>x>>y;
if(vis[x] || vis[y])continue;
x=find(x);
y=find(y);
if(x!=y){
q[y].join(q[x]);
merge(x,y);
}
}else if(opt==2){
int x;
cin>>x;
if(vis[x]){
cout<<-1<<"\n";
}else{
x=find(x);
// cerr<<x<<endl;
// cerr<<q[x].size()<<"\n";
cout<<q[x].top().first<<"\n";
vis[q[x].top().second]=1;
q[x].pop();
}
}
}
return 0;
}
```
# 平衡树篇
建议使用
```cpp
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;
__gnu_pbds::tree<int,__gnu_pbds::null_type,less<int>,__gnu_pbds::rb_tree_tag,__gnu_pbds::tree_order_statistics_node_update> Tree;
/*
insert(x):插入x
erase(x):删除x
find_by_order(k):求平衡树内排名为k的值是多少
order_of_key (x):求x的排名
能当set用
*/
int main(){
return 0;
}
```
~~(其实在很多时候没必要这么麻烦,vector就行了)~~
# 哈希表篇:
用gp_hash_table或cc_hash_table代替map或unordered_map即可