#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
template <typename T>
class Heap {
T* values;
int dimVect;
public:
Heap(int capVect) {
dimVect = 0;
values = new T[capVect];
}
void pushUp(int poz) {
int indice = (poz - 1) / 2;
if (values[indice] > values[poz] && poz > 0) {
T aux;
aux = values[poz];
values[poz] = values[indice];
values[indice] = aux;
pushUp(indice);
}
}
void pushDown(int poz) {
int indice;
if (2 * poz + 2 > dimVect && 2 * poz + 1 > dimVect)
return;
else if (2 * poz + 2 > dimVect && 2 * poz + 1 <= dimVect)
indice = 2 * poz + 1;
else if (2 * poz + 2 <= dimVect && 2 * poz + 1 > dimVect)
indice = 2 * poz + 2;
else {
if (values[2 * poz + 2] > values[2 * poz + 1])
indice = 2 * poz + 1;
else
indice = 2 * poz + 2;
}
if (values[poz] > values[indice]) {
T aux;
aux = values[poz];
values[poz] = values[indice];
values[indice] = aux;
pushDown(indice);
}
}
void insert(T x) {
values[dimVect] = x;
pushUp(dimVect);
dimVect++;
}
T peek() {
return values[0];
}
void remove (T x) {
int i;
for (i = 0; i < dimVect; i++)
if (values[i] == x)
break;
dimVect--;
values[i] = values[dimVect];
pushDown(i);
}
T extractMin() {
dimVect--;
T min = values[0];
values[0] = values[dimVect];
pushDown(0);
return min;
}
~Heap() {
delete[] values;
}
};
int main() {
vector<int> numbers;
ifstream in;
in.open("heapuri.in");
ofstream out;
out.open("heapuri.out");
int n, i, Op, x;
in >> n;
Heap<int> heap(n);
for (i = 0; i < n; i++) {
in >> Op;
if (Op == 1) {
in >> x;
heap.insert(x);
numbers.push_back(x);
}
else if (Op == 2) {
in >> x;
heap.remove(numbers[x-1]);
}
else {
out << heap.peek() << "\n";
}
}
in.close();
out.close();
return 0;
}