堆
#include<cstdio> #include<cstring> #include<cmath> #include<ctime> #include<iostream> #include<algorithm> #include<queue> #include<set> #define maxint (2147483647) #define l(a) ((a)<<1) #define r(a) ((a)<<1|1) #define b(a) (2<<(a)) #define f(a) ((a)>>1) #define rep(i,a,b) for(int i=a;i<=(b);i++) #define clr(a) memset(a,0,sizeof(a)) typedef long long ll; using namespace std; int readint(){ int t=0,f=1;char c=getchar(); while(!isdigit(c)){ if(c=='-') f=-1; c=getchar(); } while(isdigit(c)){ t=(t<<3)+(t<<1)+c-'0'; c=getchar(); } return t*f; } ll readll(){ ll t=0ll,f=1ll;char c=getchar(); while(!isdigit(c)){ if(c=='-') f=-1ll; c=getchar(); } while(isdigit(c)){ t=(t<<3ll)+(t<<1ll)+ll(c-'0'); c=getchar(); } return t*f; } const int maxn=1000009; struct heap{ int cnt,a[maxn<<2]; inline void init(){ clr(a);cnt=0; } inline int top(){ return a[1]; } inline void up(int x){ if(x==1) return; if(a[x]<a[f(x)]){ swap(a[f(x)],a[x]); up(f(x)); } } inline void push(int t){ a[++cnt]=t;up(cnt); } inline void pop(){ if(!cnt) return; a[1]=a[cnt];a[cnt--]=0;down(1); } inline void down(int x){ if(a[l(x)]+a[r(x)]==0) return; if(a[l(x)]*a[r(x)]==0){ if(a[l(x)]) if(a[l(x)]<a[x]) swap(a[l(x)],a[x]),down(l(x)); if(a[r(x)]) if(a[r(x)]<a[x]) swap(a[r(x)],a[x]),down(r(x)); return; } if(a[x]>min(a[l(x)],a[r(x)])) if(a[l(x)]<a[r(x)]){ swap(a[l(x)],a[x]);down(l(x)); }else{ swap(a[r(x)],a[x]);down(r(x)); } } inline void out(){ rep(i,1,cnt) printf(" %d %d\n",i,a[i]); } }Q; int n; int main(){ //freopen("#intput.txt","r",stdin); //freopen("#output.txt","w",stdout); n=readint();Q.init(); while(n--){ int opt=readint(); if(opt==1){ int t=readint();Q.push(t); }else if(opt==2) printf("%d\n",Q.top()); else Q.pop(); } //fclose(stdin); //fclose(stdout); return 0; }