#include <algorithm>
#include <iostream>
template<typename T>
struct Link
{
T val;
Link* prev;
Link* succ;
Link(const T& value, Link* p = nullptr, Link* s = nullptr)
:val{value},prev {p}, succ{ s } {}
Link* add_ordered_(Link* link)
{
if (link == nullptr) {
return this;
}
auto p = find_neighbor(*link);
link->insert_between(p.first, p.second);
if (prev) {
return prev; // == link
}
return this;
}
private:
std::pair<Link*, Link*> find_neighbor(const Link& link) {
Link* left = nullptr;
Link* right = this;
while (right && right->val < link.val) {
left = right;
right = right->succ;
}
return {left, right};
}
void insert_between(Link* left, Link* right)
{
prev = left;
succ = right;
if (left) {
left->succ = this;
}
if (right) {
right->prev = this;
}
}
};
template<typename T>
void print_link(Link<T>* x)
{
while (x)
{
std::cout << x->val << std::endl;
x = x->succ;
}
}
int main()
{
Link<int> number5{5};
Link<int> numbers[]{{7}, {3}, {25}, {19}, {22}, {16}, {44}, {11}, {37}};
auto* list = &number5;
for (auto& number : numbers) {
list = list->add_ordered_(&number);
}
print_link(list);
std::cout << std::endl;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IExpbmsKewogICAgVCB2YWw7CiAgICBMaW5rKiBwcmV2OwogICAgTGluayogc3VjYzsKCiAgICBMaW5rKGNvbnN0IFQmIHZhbHVlLCBMaW5rKiBwID0gbnVsbHB0ciwgTGluayogcyA9IG51bGxwdHIpCiAgICAgICAgOnZhbHt2YWx1ZX0scHJldiB7cH0sIHN1Y2N7IHMgfSB7fQoKICAgIExpbmsqIGFkZF9vcmRlcmVkXyhMaW5rKiBsaW5rKQogICAgewogICAgICAgIGlmIChsaW5rID09IG51bGxwdHIpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7ICAgCiAgICAgICAgfQogICAgICAgIGF1dG8gcCA9IGZpbmRfbmVpZ2hib3IoKmxpbmspOwogICAgICAgIGxpbmstPmluc2VydF9iZXR3ZWVuKHAuZmlyc3QsIHAuc2Vjb25kKTsKICAgICAgICBpZiAocHJldikgewogICAgICAgICAgICByZXR1cm4gcHJldjsgLy8gPT0gbGluawogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpczsKICAgIH0KCnByaXZhdGU6CiAgICBzdGQ6OnBhaXI8TGluayosIExpbmsqPiBmaW5kX25laWdoYm9yKGNvbnN0IExpbmsmIGxpbmspIHsKICAgICAgICBMaW5rKiBsZWZ0ID0gbnVsbHB0cjsKICAgICAgICBMaW5rKiByaWdodCA9IHRoaXM7CiAgICAgICAgCiAgICAgICAgd2hpbGUgKHJpZ2h0ICYmIHJpZ2h0LT52YWwgPCBsaW5rLnZhbCkgewogICAgICAgICAgICBsZWZ0ID0gcmlnaHQ7CiAgICAgICAgICAgIHJpZ2h0ID0gcmlnaHQtPnN1Y2M7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7bGVmdCwgcmlnaHR9OwogICAgfQoKICAgIHZvaWQgaW5zZXJ0X2JldHdlZW4oTGluayogbGVmdCwgTGluayogcmlnaHQpCiAgICB7CiAgICAgICAgcHJldiA9IGxlZnQ7CiAgICAgICAgc3VjYyA9IHJpZ2h0OwogICAgICAgIGlmIChsZWZ0KSB7CiAgICAgICAgICAgIGxlZnQtPnN1Y2MgPSB0aGlzOyAgIAogICAgICAgIH0KICAgICAgICBpZiAocmlnaHQpIHsKICAgICAgICAgICAgcmlnaHQtPnByZXYgPSB0aGlzOyAgIAogICAgICAgIH0KICAgIH0KfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnZvaWQgcHJpbnRfbGluayhMaW5rPFQ+KiB4KQp7CiAgICB3aGlsZSAoeCkKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgeC0+dmFsIDw8IHN0ZDo6ZW5kbDsKICAgICAgICB4ID0geC0+c3VjYzsKICAgIH0KfQoKaW50IG1haW4oKQp7CiAgICBMaW5rPGludD4gbnVtYmVyNXs1fTsKICAgIExpbms8aW50PiBudW1iZXJzW117ezd9LCB7M30sIHsyNX0sIHsxOX0sIHsyMn0sIHsxNn0sIHs0NH0sIHsxMX0sIHszN319OwogICAgCiAgICBhdXRvKiBsaXN0ID0gJm51bWJlcjU7CiAgICAKICAgIGZvciAoYXV0byYgbnVtYmVyIDogbnVtYmVycykgewogICAgICAgIGxpc3QgPSBsaXN0LT5hZGRfb3JkZXJlZF8oJm51bWJlcik7CiAgICB9CiAgICBwcmludF9saW5rKGxpc3QpOwogICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKfQo=