#include <iostream>
#include <iomanip>
#include <algorithm>
using namespace std;
class MinStack
{
private:
int * stk;
size_t capacity, size_;
int m = 0;
void resize_()
{
if (capacity == size_)
{
int * tmp = new int[capacity *= 2];
for(size_t i = 0; i < size_; ++i)
tmp[i] = stk[i];
delete[] stk;
stk = tmp;
}
}
void swap(MinStack& s)
{
std::swap(stk,s.stk);
std::swap(capacity,s.capacity);
std::swap(size_,s.size_);
std::swap(m,s.m);
}
public:
MinStack(size_t sz = 16):stk(new int[sz+1]),capacity(sz+1),size_(0){}
~MinStack()
{
delete[] stk;
}
MinStack(const MinStack& s):stk(new int[s.size_]),capacity(s.size_)
,size_(s.size_),m(s.m)
{
for(size_t i = 0; i < s.size_; ++i)
stk[i] = s.stk[i];
}
MinStack& operator = (const MinStack& s)
{
MinStack tmp(s);
swap(tmp);
return *this;
}
void push(int i)
{
resize_();
m = (size_ == 0) ? i : std::min(m,i);
stk[size_++] = i;
}
bool empty() const
{
return size_ == 0;
}
int pop()
{
if (empty()) throw runtime_error("pop from empty stack");
int r = stk[--size_];
if (r == m && size_) m = *std::min_element(stk,stk+size_);
return r;
}
int min() const
{
if (empty()) throw runtime_error("min from empty stack");
return m;
}
int back() const
{
if (empty()) throw runtime_error("back from empty stack");
return stk[size_-1];
}
void clear()
{
size_ = 0;
}
size_t size() const { return size_; }
};
int main()
{
MinStack s;
for(int i = 0; i < 20; ++i)
{
int d = rand()%90+10;
cout << d << " ";
s.push(d);
}
cout << endl;
for(int i = 0; i < 20; ++i)
{
cout << setw(2) << s.size() << ": " << s.min() << " ";
cout << s.pop() << endl;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPGFsZ29yaXRobT4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBNaW5TdGFjawp7CnByaXZhdGU6CiAgICBpbnQgKiBzdGs7CiAgICBzaXplX3QgY2FwYWNpdHksIHNpemVfOwogICAgaW50IG0gPSAwOwogICAgdm9pZCByZXNpemVfKCkKICAgIHsKICAgICAgICBpZiAoY2FwYWNpdHkgPT0gc2l6ZV8pCiAgICAgICAgewogICAgICAgICAgICBpbnQgKiB0bXAgPSBuZXcgaW50W2NhcGFjaXR5ICo9IDJdOwogICAgICAgICAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZV87ICsraSkKICAgICAgICAgICAgICAgIHRtcFtpXSA9IHN0a1tpXTsKICAgICAgICAgICAgZGVsZXRlW10gc3RrOwogICAgICAgICAgICBzdGsgPSB0bXA7CiAgICAgICAgfQogICAgfQogICAgdm9pZCBzd2FwKE1pblN0YWNrJiBzKQogICAgewogICAgICAgIHN0ZDo6c3dhcChzdGsscy5zdGspOwogICAgICAgIHN0ZDo6c3dhcChjYXBhY2l0eSxzLmNhcGFjaXR5KTsKICAgICAgICBzdGQ6OnN3YXAoc2l6ZV8scy5zaXplXyk7CiAgICAgICAgc3RkOjpzd2FwKG0scy5tKTsKICAgIH0KcHVibGljOgogICAgTWluU3RhY2soc2l6ZV90IHN6ID0gMTYpOnN0ayhuZXcgaW50W3N6KzFdKSxjYXBhY2l0eShzeisxKSxzaXplXygwKXt9CiAgICB+TWluU3RhY2soKQogICAgewogICAgICAgIGRlbGV0ZVtdIHN0azsKICAgIH0KICAgIE1pblN0YWNrKGNvbnN0IE1pblN0YWNrJiBzKTpzdGsobmV3IGludFtzLnNpemVfXSksY2FwYWNpdHkocy5zaXplXykKICAgICAgICAsc2l6ZV8ocy5zaXplXyksbShzLm0pCiAgICB7CiAgICAgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHMuc2l6ZV87ICsraSkKICAgICAgICAgICAgc3RrW2ldID0gcy5zdGtbaV07CiAgICB9CiAgICBNaW5TdGFjayYgb3BlcmF0b3IgPSAoY29uc3QgTWluU3RhY2smIHMpCiAgICB7CiAgICAgICAgTWluU3RhY2sgdG1wKHMpOwogICAgICAgIHN3YXAodG1wKTsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogICAgdm9pZCBwdXNoKGludCBpKQogICAgewogICAgICAgIHJlc2l6ZV8oKTsKICAgICAgICBtID0gKHNpemVfID09IDApID8gaSA6IHN0ZDo6bWluKG0saSk7CiAgICAgICAgc3RrW3NpemVfKytdID0gaTsKICAgIH0KICAgIGJvb2wgZW1wdHkoKSBjb25zdAogICAgewogICAgICAgIHJldHVybiBzaXplXyA9PSAwOwogICAgfQogICAgaW50IHBvcCgpCiAgICB7CiAgICAgICAgaWYgKGVtcHR5KCkpIHRocm93IHJ1bnRpbWVfZXJyb3IoInBvcCBmcm9tIGVtcHR5IHN0YWNrIik7CiAgICAgICAgaW50IHIgPSBzdGtbLS1zaXplX107CiAgICAgICAgaWYgKHIgPT0gbSAmJiBzaXplXykgbSA9ICpzdGQ6Om1pbl9lbGVtZW50KHN0ayxzdGsrc2l6ZV8pOwogICAgICAgIHJldHVybiByOwogICAgfQogICAgaW50IG1pbigpIGNvbnN0CiAgICB7CiAgICAgICAgaWYgKGVtcHR5KCkpIHRocm93IHJ1bnRpbWVfZXJyb3IoIm1pbiBmcm9tIGVtcHR5IHN0YWNrIik7CiAgICAgICAgcmV0dXJuIG07CiAgICB9CiAgICBpbnQgYmFjaygpIGNvbnN0CiAgICB7CiAgICAgICAgaWYgKGVtcHR5KCkpIHRocm93IHJ1bnRpbWVfZXJyb3IoImJhY2sgZnJvbSBlbXB0eSBzdGFjayIpOwogICAgICAgIHJldHVybiBzdGtbc2l6ZV8tMV07CiAgICB9CiAgICB2b2lkIGNsZWFyKCkKICAgIHsKICAgICAgICBzaXplXyA9IDA7CiAgICB9CiAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNpemVfOyB9Cn07CgppbnQgbWFpbigpCnsKICAgIE1pblN0YWNrIHM7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgMjA7ICsraSkKICAgIHsKICAgICAgICBpbnQgZCA9IHJhbmQoKSU5MCsxMDsKICAgICAgICBjb3V0IDw8IGQgPDwgIiAgIjsKICAgICAgICBzLnB1c2goZCk7CiAgICB9CiAgICBjb3V0IDw8IGVuZGw7CgogICAgZm9yKGludCBpID0gMDsgaSA8IDIwOyArK2kpCiAgICB7CiAgICAgICAgY291dCA8PCBzZXR3KDIpIDw8IHMuc2l6ZSgpIDw8ICI6ICIgPDwgcy5taW4oKSA8PCAiICAiOwogICAgICAgIGNvdXQgPDwgcy5wb3AoKSA8PCBlbmRsOwogICAgfQp9Cg==