import java.util.*;
import java.util.Stack;

public class Solution {
    // 用于存储内容的栈
    Stack<Integer> nodeStack = new Stack<>();
    // 用于【同步】存储当前栈中最小值的栈
    Stack<Integer> minStack = new Stack<>();
    
    // 入栈
    public void push(int node) {
        // 两个栈要同步
        
        // 入nodeStack
        nodeStack.push(node);

        // 入minStack
        if (minStack.isEmpty()) {
            // 如果minStack空,则无需比较
            minStack.push(node);
        }
        // 如果minStack非空,则需要比较,将较小的压入minStack
        int min = Math.min(node, minStack.peek());
        minStack.push(min);
    }
    
    // 出栈(只弹出不返回)
    public void pop() {
        // 两个栈要同步
        nodeStack.pop();
        minStack.pop();
    }
    
    // 获得栈顶元素(只返回不弹出)
    public int top() {
        return nodeStack.peek();
    }
    
    // 获得栈中最小元素(只返回不弹出)
    public int min() {
        return minStack.peek();
    }
}