class Solution {
private:
    vector<int> list;
    vector<int> min_list;
public:
    void push(int value) {
        if(list.empty()) {
            list.push_back(value);
            min_list.push_back(0);
        }
        else{

            if(value<list.at(min_list.at(min_list.size()-1))) {
                list.push_back(value);
                min_list.push_back(list.size()-1);
            }
            else {
                list.push_back(value);
                min_list.push_back(min_list.at(min_list.size()-1));
            }
        }
    }
    void pop() {
        list.pop_back();
        min_list.pop_back();
    }
    int top() {
        return list.at(list.size()-1);
    }
    int min() {
        return list.at(min_list.at(min_list.size()-1));
    }
};