#include <algorithm>
#include <vector>
class Solution {
    std::vector<int> data_;
    std::vector<int> min_data_;
public:
    void push(int value) {
        data_.push_back(value);
        if (min_data_.empty()) {
            min_data_.push_back(value);
        } else {
            min_data_.push_back(std::min(value, min_data_.back()));
        }
    }
    void pop() {
        if (!min_data_.empty()) {
            data_.pop_back();
            min_data_.pop_back();
        }
    }
    int top() {
        if (data_.empty()) return -1;
        return data_.back();
    }
    int min() {
        return min_data_.back();
    }
};