template <typename T> void StackWithMin<T>::push(const T& data){
MainStack.push(data);
if(MinStack.size()==0||data<MinStack.top())
MinStack.push(data);
else
MinStack.push(MinStack.top());
}
template <typename T> void StackWithMin<T>::pop(){
assert(MinStack.size()>0&&MainStack.size()>0);
MainStack.pop();
MinStack.pop();
}
template <typename T> const T& StackWithMin<T>::min(){
assert(MinStack.size()>0&&MainStack.size()>0);
return MinStack.top();
}