#include <algorithm>
#include <exception>
#include <iostream>
#include <list>
int detach(std::list<int>& l)
{
if (l.size() < 2) {
throw std::runtime_error("too short list");
}
auto it = std::is_sorted_until(l.begin(), l.end());
if (it == l.end()) {
throw std::runtime_error("already sorted list");
}
if (!std::is_sorted(it, l.end())) {
throw std::runtime_error("not 'partially' sorted list");
}
if (std::prev(it) == l.begin() || *it < *std::prev(it, 2)) {
auto res = *it;
l.erase(it);
return res;
} else {
auto res = *std::prev(it);
l.erase(std::prev(it));
return res;
}
}
void test(std::list<int> l)
{
try {
std::cout << detach(l) << std::endl;
if (!std::is_sorted(l.begin(), l.end())) {
std::cout << "result not sorted\n";
}
} catch (const std::exception& e) {
std::cout << e.what() << std::endl;
}
}
int main()
{
test({1}); // too short list
test({1, 2, 3}); // already sorted list
test({1, 3, 2, 0}); // not partially sorted list
test({3, 1}); // 3 or 1 (currently 1)
test({3, 1, 5}); // 1
test({1, 4, 2, 10}); // 4 or 2 (currently 4)
test({28, 144, 44, 52, 60}); // 144
test({60, 68, 76, 84, 65, 100}); // 65
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGV4Y2VwdGlvbj4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGlzdD4KCmludCBkZXRhY2goc3RkOjpsaXN0PGludD4mIGwpCnsKICAgIGlmIChsLnNpemUoKSA8IDIpIHsKICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoInRvbyBzaG9ydCBsaXN0Iik7CiAgICB9CiAgICBhdXRvIGl0ID0gc3RkOjppc19zb3J0ZWRfdW50aWwobC5iZWdpbigpLCBsLmVuZCgpKTsKICAgIGlmIChpdCA9PSBsLmVuZCgpKSB7CiAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJhbHJlYWR5IHNvcnRlZCBsaXN0Iik7CiAgICB9CiAgICBpZiAoIXN0ZDo6aXNfc29ydGVkKGl0LCBsLmVuZCgpKSkgewogICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigibm90ICdwYXJ0aWFsbHknIHNvcnRlZCBsaXN0Iik7CiAgICB9CiAgICBpZiAoc3RkOjpwcmV2KGl0KSA9PSBsLmJlZ2luKCkgfHwgKml0IDwgKnN0ZDo6cHJldihpdCwgMikpIHsKICAgICAgICBhdXRvIHJlcyA9ICppdDsKICAgICAgICBsLmVyYXNlKGl0KTsKICAgICAgICByZXR1cm4gcmVzOwogICAgfSBlbHNlIHsKICAgICAgICBhdXRvIHJlcyA9ICpzdGQ6OnByZXYoaXQpOwogICAgICAgIGwuZXJhc2Uoc3RkOjpwcmV2KGl0KSk7CiAgICAgICAgcmV0dXJuIHJlczsKICAgIH0KfQoKdm9pZCB0ZXN0KHN0ZDo6bGlzdDxpbnQ+IGwpCnsKICAgIHRyeSB7CiAgICAgICAgc3RkOjpjb3V0IDw8IGRldGFjaChsKSA8PCBzdGQ6OmVuZGw7CiAgICAgICAgaWYgKCFzdGQ6OmlzX3NvcnRlZChsLmJlZ2luKCksIGwuZW5kKCkpKSB7CiAgICAgICAgICAgICBzdGQ6OmNvdXQgPDwgInJlc3VsdCBub3Qgc29ydGVkXG4iOwogICAgICAgIH0KICAgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8IGUud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKICAgIH0JCgp9CgppbnQgbWFpbigpIAp7CiAgICB0ZXN0KHsxfSk7IC8vIHRvbyBzaG9ydCBsaXN0CiAgICB0ZXN0KHsxLCAyLCAzfSk7IC8vIGFscmVhZHkgc29ydGVkIGxpc3QKICAgIHRlc3QoezEsIDMsIDIsIDB9KTsgLy8gbm90IHBhcnRpYWxseSBzb3J0ZWQgbGlzdAoKICAgIHRlc3QoezMsIDF9KTsgLy8gMyBvciAxIChjdXJyZW50bHkgMSkKICAgIHRlc3QoezMsIDEsIDV9KTsgLy8gMQogICAgdGVzdCh7MSwgNCwgMiwgMTB9KTsgLy8gNCBvciAyIChjdXJyZW50bHkgNCkKICAgIHRlc3QoezI4LCAxNDQsIDQ0LCA1MiwgNjB9KTsgLy8gMTQ0CiAgICB0ZXN0KHs2MCwgNjgsIDc2LCA4NCwgNjUsIDEwMH0pOyAvLyA2NQp9Cg==