#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;
}