use std::io;
use std::mem::swap;
static root:usize=1;
static mut Heap:[i32;1000010]=[0;1000010];
static mut sz:usize=0;
fn getmin()->i32{
unsafe{
return Heap[root];
}
}
fn pushdown(u:usize){
unsafe{
if u<<1 > sz{
return;
}
if Heap[u]<Heap[u<<1] && Heap[u]<Heap[u<<1|1]{
return;
}else if Heap[u<<1]<Heap[u<<1|1]{
swap(&mut Heap[u<<1],&mut Heap[u]);
pushdown(u<<1);
}else{
swap(&mut Heap[u<<1|1],&mut Heap[u]);
pushdown(u<<1|1);
}
}
}
fn popmin(){
unsafe{
swap(&mut Heap[root],&mut Heap[sz]);
sz-=1;
pushdown(root);
}
}
fn pushup(u:usize){
if u==1{
return;
}
unsafe{
if Heap[u]<Heap[u>>1]{
swap(&mut Heap[u],&mut Heap[u>>1]);
pushup(u>>1);
}
}
}
fn pushv(v:i32){
unsafe{
sz+=1;
Heap[sz]=v;
pushup(sz);
}
}
fn main(){
let mut inp=String::new();
io::stdin().read_line(&mut inp);
let mut n:i32=inp.trim().parse().expect("");
let mut opt:i32=0;
let mut val:i32=0;
let mut item:i32=0;
while n!=0{
n-=1;
inp="".to_string();
io::stdin().read_line(&mut inp);
let mut getit=inp.split_whitespace();
item=getit.next().unwrap().parse().unwrap();
if item==1{
item=getit.next().unwrap().parse().unwrap();
pushv(item);
continue;
}else if item==2{
println!("{}",getmin());
continue;
}else if item==3{
popmin();
continue;
}
}
}