#include <cassert>
#include <iostream>
#include <memory>
using namespace std;
const int DYNAMIC_ARRAYED_STACK_MIN_CAPACITY = 1;
template<class E>
class DynamicArrayedStack {
public:
DynamicArrayedStack() {
clear();
}
void clear() {
_size = 0;
_capacity = DYNAMIC_ARRAYED_STACK_MIN_CAPACITY;
_elements.reset(new E[_capacity]);
}
int size() {
return _size;
}
bool is_empty() {
return _size == 0;
}
E peek() {
assert(!is_empty());
return _elements[_size - 1];
}
void pop() {
assert(!is_empty());
_size--;
if (_capacity > (3 * _size))
resize();
}
void push(E x) {
if (_size == _capacity)
resize();
_elements[_size] = x;
_size++;
}
private:
unique_ptr<E[]> _elements;
int _size, _capacity;
void resize() {
_capacity = max(_size * 2, DYNAMIC_ARRAYED_STACK_MIN_CAPACITY);
unique_ptr<E[]> new_array(new E[_capacity]);
for (int i = 0; i < _size; i++)
new_array[i] = _elements[i];
_elements.swap(new_array);
}
};
const int N = 6*1000*1000;
int main() {
unique_ptr<DynamicArrayedStack<int>> st(new DynamicArrayedStack<int>());
for (int i = 1; i <= N; i++) {
st->push(i);
assert(st->size() == i);
}
assert(st->size() == N);
assert(st->peek() == N);
for (int i = N; i >= 1; i--) {
assert(st->size() == i);
assert(st->peek() == i);
st->pop();
}
return 0;
}
I2luY2x1ZGUgPGNhc3NlcnQ+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPG1lbW9yeT4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgRFlOQU1JQ19BUlJBWUVEX1NUQUNLX01JTl9DQVBBQ0lUWSA9IDE7Cgp0ZW1wbGF0ZTxjbGFzcyBFPgpjbGFzcyBEeW5hbWljQXJyYXllZFN0YWNrIHsKCXB1YmxpYzoKCQlEeW5hbWljQXJyYXllZFN0YWNrKCkgewogICAgICAgICAgICBjbGVhcigpOwoJCX0KCgkJdm9pZCBjbGVhcigpIHsKCQkJX3NpemUgPSAwOwoJCQlfY2FwYWNpdHkgPSBEWU5BTUlDX0FSUkFZRURfU1RBQ0tfTUlOX0NBUEFDSVRZOwoJCQlfZWxlbWVudHMucmVzZXQobmV3IEVbX2NhcGFjaXR5XSk7CgkJfQoKCQlpbnQgc2l6ZSgpIHsKCQkJcmV0dXJuIF9zaXplOwoJCX0KCQkKCQlib29sIGlzX2VtcHR5KCkgewoJCQlyZXR1cm4gX3NpemUgPT0gMDsKCQl9CgkJCgkJRSBwZWVrKCkgewoJCQlhc3NlcnQoIWlzX2VtcHR5KCkpOwoJCQlyZXR1cm4gX2VsZW1lbnRzW19zaXplIC0gMV07CgkJfQoJCQoJCXZvaWQgcG9wKCkgewoJCQlhc3NlcnQoIWlzX2VtcHR5KCkpOwoJCQlfc2l6ZS0tOwogICAgICAgICAgICBpZiAoX2NhcGFjaXR5ID4gKDMgKiBfc2l6ZSkpCgkJCQlyZXNpemUoKTsKCQl9CgkJCgkJdm9pZCBwdXNoKEUgeCkgewoJCQlpZiAoX3NpemUgPT0gX2NhcGFjaXR5KQoJCQkJcmVzaXplKCk7CgkJCV9lbGVtZW50c1tfc2l6ZV0gPSB4OwoJCQlfc2l6ZSsrOwoJCX0KCglwcml2YXRlOgoJCXVuaXF1ZV9wdHI8RVtdPiBfZWxlbWVudHM7CgkJaW50IF9zaXplLCBfY2FwYWNpdHk7CgkJCgkJdm9pZCByZXNpemUoKSB7CgkJCV9jYXBhY2l0eSA9IG1heChfc2l6ZSAqIDIsIERZTkFNSUNfQVJSQVlFRF9TVEFDS19NSU5fQ0FQQUNJVFkpOwoJCQl1bmlxdWVfcHRyPEVbXT4gbmV3X2FycmF5KG5ldyBFW19jYXBhY2l0eV0pOwoJCQlmb3IgKGludCBpID0gMDsgaSA8IF9zaXplOyBpKyspCgkJCQluZXdfYXJyYXlbaV0gPSBfZWxlbWVudHNbaV07CgkJCV9lbGVtZW50cy5zd2FwKG5ld19hcnJheSk7CgkJfQp9OwoJCmNvbnN0IGludCBOID0gNioxMDAwKjEwMDA7CQoKaW50IG1haW4oKSB7CgkKCXVuaXF1ZV9wdHI8RHluYW1pY0FycmF5ZWRTdGFjazxpbnQ+PiBzdChuZXcgRHluYW1pY0FycmF5ZWRTdGFjazxpbnQ+KCkpOwoJZm9yIChpbnQgaSA9IDE7IGkgPD0gTjsgaSsrKSB7CgkJc3QtPnB1c2goaSk7CgkJYXNzZXJ0KHN0LT5zaXplKCkgPT0gaSk7Cgl9CgoJYXNzZXJ0KHN0LT5zaXplKCkgPT0gTik7Cglhc3NlcnQoc3QtPnBlZWsoKSA9PSBOKTsKCglmb3IgKGludCBpID0gTjsgaSA+PSAxOyBpLS0pIHsKCQlhc3NlcnQoc3QtPnNpemUoKSA9PSBpKTsKCQlhc3NlcnQoc3QtPnBlZWsoKSA9PSBpKTsKCQlzdC0+cG9wKCk7Cgl9CgoJcmV0dXJuIDA7Cn0=