手写的堆
#include<bits/stdc++.h> using namespace std; int tot,dui[10000000],n,x,y; inline void add(int i) { tot++; dui[tot] = i; int k = tot; while(k>1 && dui[k] < dui[k>>1]) { swap(dui[k] , dui[k>>1]); k >>= 1; } } inline void del() { dui[1] = dui[tot--]; int p = 1; bool k = 0; while(p * 2 <= tot) { if(p * 2 == tot) k = 0; else k = dui[p*2] > dui[p*2+1]; if(dui[p] > dui[p * 2 + (int)k]) { swap(dui[p] , dui[p * 2 + (int)k]); p = p * 2 + (int)k; } else break; } } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&x); if(x==1) { scanf("%d",&y); add(y); } if(x==2) printf("%d\n",dui[1]); if(x==3) del(); } }