Cod sursa(job #631937)
#include <fstream>
#include <iostream>
#define N 200010
using namespace std;
std::ifstream in ("heapuri.in");
std::ofstream out ("heapuri.out");
int h[2*N],a[N],b[N],n,m,i,k,nh,z;
void swap (int x,int y) {
b[h[y]]=x; b[h[x]]=y;
z=h[x]; h[x]=h[y]; h[y]=z;
}
void up (int k) {
if (k>1)
if (a[h[k/2]]>a[h[k]]) {
swap (k,k/2);
up (k/2);
}
}
void down (int k) {
if (2*k>nh) return;
i=k;
if (a[h[k]]>a[h[2*k]]) i=2*k;
if (2*k+1<=nh) if (a[h[i]]>a[h[2*k+1]]) i=2*k+1;
if (i!=k) {
swap (k,i);
down (i);
}
}
int main () {
in>>m;
while (m--) {
in>>i;
if (i==1) {
in>>a[++n];
b[n]=++nh;
h[nh]=n;
up (nh);
}
else if (i==2) {
in>>k;
swap (b[k],nh);
nh--;
up (b[nh+1]);
down (b[nh+1]);
}
else out<<a[h[1]]<<"\n";
}
return 0;
}