用了一点贪心
import java.util.Scanner;
import java.util.ArrayList;
public class P3389堆 {
ArrayList<Integer> a;
public P3389堆() {
Scanner sc = new Scanner(System.in);
int times = sc.nextInt();
a = new ArrayList<Integer>();
for(int i = 1 ;i <= times;i++) {
int choose = sc.nextInt();
if(choose == 1) {
int num = sc.nextInt();
add(num);
}else if(choose == 2){
System.out.println(a.get(0));
}else if(choose == 3) {
a.set(0,a.get(a.size()-1));
a.remove(a.size()-1);
sort();
}
}
}
void add(int num) {
if(a.size()<=0) {
a.add(num);
return;
}
if(num<a.get(0)) {
int temp = a.get(0);
a.set(0,num);
a.add(temp);
}else {
a.add(num);
}
}
void sort() {
if(a.size()<=1) {
return;
}
//找到第一个非叶节点
int len = a.size()/2-1;
//如果最后那个非叶节点只有左孩子,特殊处理
if(a.size()%2==0) {
if(a.get(len)>a.get(len*2+1)) {
int temp = a.get(len);
a.set(len,a.get(len*2+1));
a.set(len*2+1,temp);
}
len--;
}
//判断每一个非叶节点
for(int i = len;i>=0;i--) {
//小根堆
if(a.get(i)>Math.min(a.get(i*2+1),a.get(i*2+2))) {
//进行交换
int temp = a.get(i);
a.set(i,Math.min(a.get(i*2+1),a.get(i*2+2)));
if(a.get(i*2+1)>a.get(i*2+2)) {
a.set(i*2+2,temp);
}else {
a.set(i*2+1,temp);
}
}
}
}
public static void main(String[]args) {
P3389堆 a = new P3389堆();
}
}