class Solution {
public:
    void push(int value) {
        stk1.push(value);
        // 小于等于stk2栈顶,同时将value压入 stk1和 stk2, 空的时候也压入 stk2
        if(stk2.empty()){
            stk2.push(value);
        }else if(value<=stk2.top()) {
            stk2.push(value);
        } 
    }
    void pop() {
        if(stk1.empty())
            return ;
        // 从 stk1中弹出一个元素
        int top = stk1.top();
        stk1.pop();
        // 如果 stk2的栈顶元素也等于 stk1的栈顶元素,则stk2也弹出栈顶元素
        if(!stk2.empty() && top == stk2.top())
            stk2.pop();
    }
    int top() {
        if(stk1.empty())
            return -1;
        return stk1.top();
    }
    int min() {
        if(stk2.empty())
            return -1;
        // 栈内的最小值即 stk2的栈顶,注意不要弹出去!!
        int temp =stk2.top();
        return temp;
    }
private:
    stack<int> stk1;
    stack<int> stk2;
};