#include <stdio.h> #define MAX_SIZE 100005 // 最大堆的大小 // 定义大根堆的数组和大小 int heap[MAX_SIZE], size = 0; // 交换两个整数 void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } // 插入操作(push) // 将一个整数 x 插入堆中,并通过上滤操作保持大根堆性质 void push(int x) { // 将新元素插入堆的最后一个位置 heap[++size] = x; // 上滤操作,将新元素调整到合适的位置 for (int i = size; i > 1 && heap[i] > heap[i / 2]; i /= 2) { swap(&heap[i], &heap[i / 2]); } } // 堆顶操作(top) // 输出堆顶元素 void top() { // 如果堆为空,输出 "empty" if (size == 0) { printf("empty\n"); } else { // 输出堆顶元素 printf("%d\n", heap[1]); } } // 弹出操作(pop) // 输出堆顶元素,并从堆中删除堆顶元素 void pop() { // 如果堆为空,输出 "empty" if (size == 0) { printf("empty\n"); } else { // 输出堆顶元素 printf("%d\n", heap[1]); // 将堆顶元素替换为堆的最后一个元素,并减少堆的大小 heap[1] = heap[size--]; // 下滤操作,将堆顶元素调整到合适的位置 for (int i = 1, maxChild; (i * 2) <= size; i = maxChild) { maxChild = i * 2; // 左孩子 // 如果右孩子存在且大于左孩子,则选择右孩子 if (maxChild < size && heap[maxChild + 1] > heap[maxChild]) { maxChild++; } // 如果堆顶元素小于最大的孩子,则交换 if (heap[i] < heap[maxChild]) { swap(&heap[i], &heap[maxChild]); } else { break; } } } } // 主函数 int main() { int n, x; char op[10]; // 读取操作次数 scanf("%d", &n); // 循环读取并执行操作 while (n--) { // 读取操作字符串 scanf("%s", op); // 如果操作是 "push" if (strcmp(op, "push") == 0) { // 读取要插入的整数 x scanf("%d", &x); // 执行插入操作 push(x); } else if (strcmp(op, "pop") == 0) { // 如果操作是 "pop",执行弹出操作 pop(); } else if (strcmp(op, "top") == 0) { // 如果操作是 "top",执行堆顶操作 top(); } } return 0; }