#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
int cautare_heap(vector< int> v,int element)
{
queue<int> q;
q.push(0);
bool gasit=false;
while (!q.empty())
{
int poz=q.front();
int numar=v[poz];
q.pop();
if (numar==element)
return poz;
if (numar<element)
{
if (poz*2+1<v.size()-1)
q.push(poz*2+1);
if (poz*2+2<v.size()-1)
q.push(poz*2+2);
}
}
}
void stergere(vector <int> &v, vector <int> &crono, int pozitie)
{
int element=crono[pozitie-1];
pozitie=cautare_heap(v, element);
int l=v.size()-1;
swap (v[pozitie], v[l]);
l--;
v.pop_back();
bool heap=false;
int poz=pozitie*2+1;
while (poz<=l && !heap)
{
if (poz+1<=l&&v[poz]>v[poz+1])
poz++;
if (v[poz]<v[pozitie])
swap (v[poz], v[pozitie]);
else
heap=true;
}
}
void adaugare(vector<int> &v, vector <int> &crono, int element)
{
crono.push_back(element);
v.push_back(element);
int pozitie=v.size()-1;
while (pozitie && v[pozitie]<v[pozitie/2])
{
swap(v[pozitie], v[pozitie/2]);
pozitie/=2;
}
}
int main()
{
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int nr_operatii;
vector <int> v, crono;
f>>nr_operatii;
for (int i=0; i<nr_operatii; i++)
{
int cod_operatie;
f>>cod_operatie;
switch (cod_operatie)
{
case 1:
int element;
f>>element;
adaugare(v, crono, element);
break;
case 2:
int pozitie;
f>>pozitie;
stergere(v, crono, pozitie);
break;
default:
g<<v[0]<<"\n";
break;
}
}
return 0;
}