#include <algorithm>
#include <exception>
#include <iostream>
#include <list>
struct node {node * next; int val;};
void destroy(node* n)
{
while (n != nullptr) {
auto next = n->next;
delete n;
n = next;
}
}
node* create(const std::list<int>& l)
{
if (l.empty()) { return nullptr; }
node* root = nullptr;
node* last = root;
for (auto e : l) {
node* n = new node();
n->next = nullptr;
n->val = e;
if (root == nullptr) {
root = n;
last = root;
} else {
last->next = n;
last = n;
}
}
return root;
}
bool is_sorted(const node* n) {
const node* cur = n;
const node* next = cur->next;
while (next != nullptr && cur->val < next->val) {
cur = next;
next = next->next;
}
return next == nullptr;
}
node* extract(node*& root, node* prev, node* n)
{
if (prev == nullptr)
{
if (root == nullptr) {
return nullptr;
}
root = n->next;
n->next = nullptr;
return n;
}
prev->next = prev->next->next;
n->next = nullptr;
return n;
}
node* detach(node*& root)
{
if (root == nullptr || root->next == nullptr) {
throw std::runtime_error("too short list");
}
node* prev = nullptr;
node* cur = root;
node* next = cur->next;
while (next != nullptr && cur->val < next->val) {
prev = cur;
cur = next;
next = next->next;
}
if (next == nullptr) {
throw std::runtime_error("already sorted list");
}
if (!is_sorted(next)) {
throw std::runtime_error("not 'partially' sorted list");
}
if (next->next == nullptr || next->next->val < cur->val) {
return extract(root, prev, cur);
} else {
return extract(root, cur, next);
}
}
void test(std::list<int> l)
{
node* root = create(l);
node* n = nullptr;
try {
n = detach(root);
std::cout << n->val << std::endl;
if (!is_sorted(root)) {
throw std::runtime_error("result not sorted");
}
} catch (const std::exception& e) {
std::cout << e.what() << std::endl;
}
destroy(root);
destroy(n);
}
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 3)
test({3, 1, 5}); // 1
test({1, 4, 2, 10}); // 4 or 2 (currently 2)
test({28, 144, 44, 52, 60}); // 144
test({60, 68, 76, 84, 65, 100}); // 65
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGV4Y2VwdGlvbj4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGlzdD4KCgpzdHJ1Y3Qgbm9kZSB7bm9kZSAqIG5leHQ7IGludCB2YWw7fTsKCgp2b2lkIGRlc3Ryb3kobm9kZSogbikKewogICAgd2hpbGUgKG4gIT0gbnVsbHB0cikgewogICAgICAgIGF1dG8gbmV4dCA9IG4tPm5leHQ7CiAgICAgICAgZGVsZXRlIG47CiAgICAgICAgbiA9IG5leHQ7CiAgICB9Cn0KCm5vZGUqIGNyZWF0ZShjb25zdCBzdGQ6Omxpc3Q8aW50PiYgbCkKewogICAgaWYgKGwuZW1wdHkoKSkgeyByZXR1cm4gbnVsbHB0cjsgfQogICAgCiAgICBub2RlKiByb290ID0gbnVsbHB0cjsKICAgIG5vZGUqIGxhc3QgPSByb290OwogICAgCiAgICBmb3IgKGF1dG8gZSA6IGwpIHsKICAgICAgICBub2RlKiBuID0gbmV3IG5vZGUoKTsKICAgICAgICBuLT5uZXh0ID0gbnVsbHB0cjsKICAgICAgICBuLT52YWwgPSBlOwogICAgICAgIAogICAgICAgIGlmIChyb290ID09IG51bGxwdHIpIHsKICAgICAgICAgICAgcm9vdCA9IG47CiAgICAgICAgICAgIGxhc3QgPSByb290OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxhc3QtPm5leHQgPSBuOwogICAgICAgICAgICBsYXN0ID0gbjsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gcm9vdDsKfQoKYm9vbCBpc19zb3J0ZWQoY29uc3Qgbm9kZSogbikgewogICAgY29uc3Qgbm9kZSogY3VyID0gbjsKICAgIGNvbnN0IG5vZGUqIG5leHQgPSBjdXItPm5leHQ7CiAgICAKICAgIHdoaWxlIChuZXh0ICE9IG51bGxwdHIgJiYgY3VyLT52YWwgPCBuZXh0LT52YWwpIHsKICAgICAgICBjdXIgPSBuZXh0OwogICAgICAgIG5leHQgPSBuZXh0LT5uZXh0OwogICAgfQkKICAgIHJldHVybiBuZXh0ID09IG51bGxwdHI7CQp9Cgpub2RlKiBleHRyYWN0KG5vZGUqJiByb290LCBub2RlKiBwcmV2LCBub2RlKiBuKQp7CiAgICBpZiAocHJldiA9PSBudWxscHRyKQogICAgewogICAgICAgIGlmIChyb290ID09IG51bGxwdHIpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7ICAgCiAgICAgICAgfQogICAgICAgIHJvb3QgPSBuLT5uZXh0OwogICAgICAgIG4tPm5leHQgPSBudWxscHRyOwogICAgICAgIHJldHVybiBuOwogICAgfQogICAgcHJldi0+bmV4dCA9IHByZXYtPm5leHQtPm5leHQ7CiAgICBuLT5uZXh0ID0gbnVsbHB0cjsKICAgIHJldHVybiBuOwp9Cgpub2RlKiBkZXRhY2gobm9kZSomIHJvb3QpCnsKICAgIGlmIChyb290ID09IG51bGxwdHIgfHwgcm9vdC0+bmV4dCA9PSBudWxscHRyKSB7CiAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJ0b28gc2hvcnQgbGlzdCIpOwogICAgfQogICAgbm9kZSogcHJldiA9IG51bGxwdHI7CiAgICBub2RlKiBjdXIgPSByb290OwogICAgbm9kZSogbmV4dCA9IGN1ci0+bmV4dDsKICAgIAogICAgd2hpbGUgKG5leHQgIT0gbnVsbHB0ciAmJiBjdXItPnZhbCA8IG5leHQtPnZhbCkgewogICAgICAgIHByZXYgPSBjdXI7CiAgICAgICAgY3VyID0gbmV4dDsKICAgICAgICBuZXh0ID0gbmV4dC0+bmV4dDsKICAgIH0KICAgIGlmIChuZXh0ID09IG51bGxwdHIpIHsKICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoImFscmVhZHkgc29ydGVkIGxpc3QiKTsKICAgIH0KICAgIGlmICghaXNfc29ydGVkKG5leHQpKSB7CiAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJub3QgJ3BhcnRpYWxseScgc29ydGVkIGxpc3QiKTsKICAgIH0KICAgIGlmIChuZXh0LT5uZXh0ID09IG51bGxwdHIgfHwgbmV4dC0+bmV4dC0+dmFsIDwgY3VyLT52YWwpIHsKICAgICAgICByZXR1cm4gZXh0cmFjdChyb290LCBwcmV2LCBjdXIpOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZXh0cmFjdChyb290LCBjdXIsIG5leHQpOwogICAgfQp9Cgp2b2lkIHRlc3Qoc3RkOjpsaXN0PGludD4gbCkKewogICAgbm9kZSogcm9vdCA9IGNyZWF0ZShsKTsKICAgIG5vZGUqIG4gPSBudWxscHRyOwogICAgdHJ5IHsKICAgICAgICBuID0gZGV0YWNoKHJvb3QpOwogICAgICAgIHN0ZDo6Y291dCA8PCBuLT52YWwgPDwgc3RkOjplbmRsOwogICAgICAgIGlmICghaXNfc29ydGVkKHJvb3QpKSB7CiAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigicmVzdWx0IG5vdCBzb3J0ZWQiKTsKICAgICAgICB9CiAgICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgZSkgewogICAgICAgIHN0ZDo6Y291dCA8PCBlLndoYXQoKSA8PCBzdGQ6OmVuZGw7CiAgICB9CiAgICBkZXN0cm95KHJvb3QpOwogICAgZGVzdHJveShuKTsKfQoKaW50IG1haW4oKSAKewogICAgdGVzdCh7MX0pOyAvLyB0b28gc2hvcnQgbGlzdAogICAgdGVzdCh7MSwgMiwgM30pOyAvLyBhbHJlYWR5IHNvcnRlZCBsaXN0CiAgICB0ZXN0KHsxLCAzLCAyLCAwfSk7IC8vIG5vdCBwYXJ0aWFsbHkgc29ydGVkIGxpc3QKIAogICAgdGVzdCh7MywgMX0pOyAvLyAzIG9yIDEgKGN1cnJlbnRseSAzKQogICAgdGVzdCh7MywgMSwgNX0pOyAvLyAxCiAgICB0ZXN0KHsxLCA0LCAyLCAxMH0pOyAvLyA0IG9yIDIgKGN1cnJlbnRseSAyKQogICAgdGVzdCh7MjgsIDE0NCwgNDQsIDUyLCA2MH0pOyAvLyAxNDQKICAgIHRlc3QoezYwLCA2OCwgNzYsIDg0LCA2NSwgMTAwfSk7IC8vIDY1Cn0KCg==