#include <bits/stdc++.h>
using namespace std;
///----------TOGGLES
#define FIO
#define LONGER
//#define TESTS
///---------
#ifdef LONGER
#define int long long
#endif // LONGER
#ifdef FIO
const string fname="heapuri";
ifstream in(fname+".in");
ofstream out(fname+".out");
#define cin in
#define cout out
#endif // FIO
///--------
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
///-------STL++-----
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define sz(x) x.size()
#define pb(x,y) x.push_back(y)
#define mp(x,y) make_pair(x,y)
#define fr(i,n) for(int i=1;i<=n;i++)
using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pdd = pair<double, double>;
using veci = vector<int>;
using vecp = vector<pii>;
template<typename T> using PQ = priority_queue<T, vector<T>, greater<T> >;
///-----CODE GOES HERE-----
struct Treap{
Treap *l, *r;
int val, prio, siz;
Treap() {l=r=0; siz=1;}
Treap(int val) : l(0), r(0), val(val), prio(rand()), siz(1){}
Treap(int val, int prio) : l(0), r(0),val(val), prio(prio), siz(1) {}
};
using trip = Treap*;
int getSiz(trip t)
{
if(!t) return 0;
return t->siz;
}
void updateSiz(trip t)
{
if(!t) return;
t->siz=1+ getSiz(t->l) + getSiz(t->r);
}
void split(trip t, trip &l, trip &r, int val)
{
if(!t) l=r=0;
else if(t->val<=val) split(t->r, t->r, r, val), l=t;
else split(t->l, l, t->l, val), r=t;
updateSiz(l);
updateSiz(r);
}
//presupunem ca au valorile in ordine (??)
void merge(trip l, trip r, trip &t)
{
if(!l||!r) t=l?l:r;
else if(l->prio>=r->prio) merge(l->r, r, l->r), t=l;
else merge(l, r->l, r->l), t=r;
updateSiz(t);
}
void insert(trip &t, trip x)
{
assert(x!=0);
if(!t) t=x;
else if(t->prio<x->prio)
{
split(t, x->l,x->r,x->val);
t=x;
}
else
{
if(x->val<=t->val) insert(t->l, x);
else insert(t->r, x);
}
updateSiz(t);
}
void erase(trip &t, int val)
{
if(!t) return;
if(t->val==val)
{
trip d=t;
merge(t->l, t->r, t);
delete d;
}
else if(val<=t->val) erase(t->l, val);
else erase(t->r, val);
updateSiz(t);
}
int getSmall(trip x)
{
assert(x);
if(!x->l) return x->val;
return getSmall(x->l);
}
const int maxn = 2e5+5;
int v[maxn], vk;
void solve()
{
trip root=0;
int n; cin>>n;
int c,x;
for(int i=1;i<=n;i++)
{
cin>>c;
if(c==1)
{
cin>>v[++vk];
insert(root, new Treap(v[vk]));
}
else if(c==2)
{
cin>>x;
erase(root, v[x]);
}
else if(c==3)
{
cout<<getSmall(root)<<'\n';
}
else assert(0);
}
}
///---MAIN FUNC-------
int32_t main()
{
IOS;
int t=1;
#ifdef TESTS
cin>>t;
#endif // TESTS
while(t--)
{
solve();
}
return 0;
}