#include <iostream>
#include <stack>
using namespace std;
template<class T>
class CMyStack{
public:
CMyStack(){};
~CMyStack(){};
T getMin()
{
return this->min.top();
}
int push(const T& item)
{
if (all.empty())
{
this->all.push(item);
this->min.push(item);
return 0;
}
T curr_min = getMin();
if (curr_min > item)
{
this->min.push(item);
}
this->all.push(item);
return 0;
}
int pop()
{
T curr_value = all.top();
T curr_min = min.top();
this->all.pop();
if (curr_value == curr_min)
{
this->min.pop();
}
return 0;
}
private:
stack<T> all;
stack<T> min;
};
int main()
{
CMyStack<int> sk;
sk.push(20);
cout<<sk.getMin()<<endl;
sk.push(10);
cout<<sk.getMin()<<endl;
sk.push(30);
cout<<sk.getMin()<<endl;
sk.push(20);
cout<<sk.getMin()<<endl;
return 0;
}