#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<vector>
void swap(int& a, int& b) {
int t = a;
a = b;
b = t;
}
class heap_min {
private:
int size;
int ans[1000001];
public:
heap_min():size(0) {}
void insert(int x);
int remove();
int top();
void sort_in(int ans[]);
void sort_out(int ans[]);
int num() { return size; }
};
void heap_min::sort_in(int ans[]) {
bool flag = 0;
int mid = (size - 2) / 2;
for (; mid >= 0; mid--) {
if (mid * 2 + 2 >= size) {
if (ans[mid * 2 + 1] < ans[mid])
swap(ans[mid], ans[mid * 2 + 1]);
}
else {
if (ans[mid * 2 + 1] < ans[mid * 2 + 2] && ans[mid * 2 + 1] < ans[mid]) {
swap(ans[mid], ans[mid * 2 + 1]);
}
else if (ans[mid * 2 + 1] >= ans[mid * 2 + 2] && ans[mid * 2 + 2] < ans[mid]) {
swap(ans[mid], ans[mid * 2 + 2]);
}
else;
}
}
};
void heap_min::sort_out(int ans[]) {
for (int j = 0; j * 2 + 1 < size;) {
if (j * 2 + 2 >= size) {
if (ans[j * 2 + 1] < ans[j]) {
swap(ans[j * 2 + 1], ans[j]);
j = j * 2 + 1;
}
else break;
}
else {
if (ans[j * 2 + 1] < ans[j * 2 + 2] && ans[j * 2 + 1] < ans[j]) {
swap(ans[j * 2 + 1], ans[j]);
j = j * 2 + 1;
}
else if (ans[j * 2 + 1] >= ans[j * 2 + 2] && ans[j * 2 + 2] < ans[j]) {
swap(ans[j * 2 + 2], ans[j]);
j = j * 2 + 2;
}
else break;
}
}
};
void heap_min::insert(int x) {
size++;
ans[size - 1] = x;
if (size == 1) return;
else {
sort_in(ans);
}
}
int heap_min::remove() {
int backval;
if (size <= 1) {
backval = ans[size - 1];
size--;
return backval;
}
else {
swap(ans[0], ans[size - 1]);
backval = ans[size - 1];
size--;
sort_out(ans);
return backval;
}
}
int heap_min::top() {
return ans[0];
}
heap_min h;
int main() {
int n, op, x;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &op);
if (op == 1) {
scanf("%d", &x);
h.insert(x);
}
else if (op == 2) {
x = h.top();
printf("%d\n", x);
}
else {
h.remove();
}
}
return 0;
}