#include<stack>
#include<assert.h>
template <typename T> class MinInStack{
public:
MinInStack(){};
virtual ~MinInStack(void){};
T& top();
const T& top() const;
void push(const T& e);
void pop();
const T& min() const;
private:
std::stack<T> m_data;
std::stack<T> min_data;
};
template <typename T> void MinInStack<T>::push(const T& value){
m_data.push(value);
if(min_data.size()==0 || value<min_data.top())
min_data.push(value);
else min_data.push(min_data.top());
}
template <typename T> void MinInStack<T>::pop(){
assert(m_data.size()>0 && min_data.size()>0);
m_data.pop();
min_data.pop();
}
template <typename T> const T& MinInStack<T>::min() const{
assert(m_data.size()>0 && min_data.size()>0);
return min_data.top();
}