package main

import (
	"fmt"
)
type MinStack struct {
    stack1 []int
    stack2 []int
}
func Construct() *MinStack {
    return &MinStack{
        stack1: make([]int, 0), // 正常栈的使用
        stack2: make([]int, 0), // 保存stack1当前的最小值,弹出值时,弹出当前最小值即可
    }
}
func min(a, b int) int {
    if a<b {
        return a
    }
    return b
}
func (m *MinStack) Add(num int) {
    m.stack1 = append(m.stack1, num)
    if len(m.stack2) == 0 {
        m.stack2 = append(m.stack2, num)
    } else {
         m.stack2 = append(m.stack2, min(num, m.stack2[len(m.stack2)-1]))
    }
}
func (m *MinStack) Pop() int {
    num := m.stack1[len(m.stack1)-1]
    m.stack1 = m.stack1[:len(m.stack1)-1]
    m.stack2 = m.stack2[:len(m.stack2)-1]
    return num
}
func (m *MinStack) GetMin() int {
    return m.stack2[len(m.stack2)-1]
}
func main() {
    opts := 0
    for {
        n, _ := fmt.Scan(&opts)
        if n == 0 {
            break
        } else {
            minstack := Construct()
            for i:=0; i<opts; i++ {
                var ops string
                fmt.Scan(&ops)
                if ops == "push" {
                    opnum := 0
                    fmt.Scan(&opnum)
                    minstack.Add(opnum)
                } else if ops == "getMin" {
                    fmt.Println(minstack.GetMin())
                } else { // pop 操作
                    minstack.Pop()
                }
            }
        }
    }
}