手写堆。
const int N=1e6+10;
int heap[N];
int n,m;
void up(int u)
{
while(u/2 && heap[u] < heap[u/2])
{
swap(heap[u],heap[u/2]);
u/=2;
}
}
void down(int u)
{
int j=u*2;
while(j <= n)
{
if(j<n && heap[j] > heap[j+1])
j++;
if(heap[j] < heap[u])
{
swap(heap[j],heap[u]);
u=j;
j=u*2;
}
else
break;
}
}
void insert(int x)
{
heap[++n]=x;
up(n);
}
int getTop()
{
return heap[1];
}
void deleteTop()
{
heap[1]=heap[n--];
down(1);
}
int main()
{
cin>>m;
while(m--)
{
int op;
cin>>op;
if(op == 1)
{
int x;
cin>>x;
insert(x);
}
else if(op == 2)
cout<<getTop()<<endl;
else
deleteTop();
}
//system("pause");
return 0;
}