#include <iostream>
#include <cstdio>
#include <stack>
#include <queue>
#include <deque> // 支持下标访问
#include <algorithm>

using namespace std;
template<typename T> class StackWithMin {
public :
    StackWithMin() {}
    virtual ~StackWithMin() {}
    const size_t size() const;
    void pop();
    void push(const T& value);
    T top() const;
    T min();
private :
    deque<T> m_data;
    deque<T> m_min;
};
template<typename T> const size_t StackWithMin<T>::size() const {
    return m_data.size();
}
template<typename T> void StackWithMin<T>::pop() {
    assert(!m_data.empty() && !m_min.empty());
    m_data.pop_front();
    m_min.pop_front();
}
template<typename T> void StackWithMin<T>::push(const T& value) {
    m_data.push_front(value);
    if(m_min.empty() || value < m_min[0]) {
        m_min.push_front(value);
    }
    else {
        m_min.push_front(m_min[0]);
    }
}
template<typename T> T StackWithMin<T>::top() const {
    assert(!m_data.empty() && !m_min.empty());
    return m_data[0];
}
template<typename T> T StackWithMin<T>::min() {
    assert(!m_data.empty() && !m_min.empty());
    return m_min[0];
}
int main() {
    return 0;
}