#include <iostream>
#include <algorithm>
template <typename C>
void ShowElement(C const& elements) {
for (const auto& element : elements) {
std::cout << element << " ";
}
std::cout << '\n';
}
struct IsNegative {
template <typename T>
bool operator()(T const& value) {
return value < 0;
}
};
struct Greater {
template <class T>
bool operator()(T const& a, T const& b) const {
return a > b;
}
};
template <typename C>
void SortElementsInDescendingOrderBeforeFirstNegativeElement(C& elements) {
auto first_negative =
std::find_if(std::begin(elements), std::end(elements), IsNegative());
std::sort(std::begin(elements), first_negative, Greater());
}
int main() {
std::vector<int> elements = {4, 7, 3, 4, 5, -2, 1, 0, -1, 8, 9};
std::cout << "Elements before sort:\n";
ShowElement(elements);
SortElementsInDescendingOrderBeforeFirstNegativeElement(elements);
std::cout << "Elements after sort:\n";
ShowElement(elements);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIEM+CnZvaWQgU2hvd0VsZW1lbnQoQyBjb25zdCYgZWxlbWVudHMpIHsKICBmb3IgKGNvbnN0IGF1dG8mIGVsZW1lbnQgOiBlbGVtZW50cykgewogICAgc3RkOjpjb3V0IDw8IGVsZW1lbnQgPDwgIiAiOwogIH0KICBzdGQ6OmNvdXQgPDwgJ1xuJzsKfQoKc3RydWN0IElzTmVnYXRpdmUgewogIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogIGJvb2wgb3BlcmF0b3IoKShUIGNvbnN0JiB2YWx1ZSkgewogICAgcmV0dXJuIHZhbHVlIDwgMDsKICB9Cn07CgpzdHJ1Y3QgR3JlYXRlciB7CiAgdGVtcGxhdGUgPGNsYXNzIFQ+CiAgYm9vbCBvcGVyYXRvcigpKFQgY29uc3QmIGEsIFQgY29uc3QmIGIpIGNvbnN0IHsKICAgIHJldHVybiBhID4gYjsKICB9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgQz4Kdm9pZCBTb3J0RWxlbWVudHNJbkRlc2NlbmRpbmdPcmRlckJlZm9yZUZpcnN0TmVnYXRpdmVFbGVtZW50KEMmIGVsZW1lbnRzKSB7CiAgYXV0byBmaXJzdF9uZWdhdGl2ZSA9CiAgICAgIHN0ZDo6ZmluZF9pZihzdGQ6OmJlZ2luKGVsZW1lbnRzKSwgc3RkOjplbmQoZWxlbWVudHMpLCBJc05lZ2F0aXZlKCkpOwogIHN0ZDo6c29ydChzdGQ6OmJlZ2luKGVsZW1lbnRzKSwgZmlyc3RfbmVnYXRpdmUsIEdyZWF0ZXIoKSk7Cn0KCmludCBtYWluKCkgewogIHN0ZDo6dmVjdG9yPGludD4gZWxlbWVudHMgPSB7NCwgNywgMywgNCwgNSwgLTIsIDEsIDAsIC0xLCA4LCA5fTsKICBzdGQ6OmNvdXQgPDwgIkVsZW1lbnRzIGJlZm9yZSBzb3J0OlxuIjsKICBTaG93RWxlbWVudChlbGVtZW50cyk7CiAgU29ydEVsZW1lbnRzSW5EZXNjZW5kaW5nT3JkZXJCZWZvcmVGaXJzdE5lZ2F0aXZlRWxlbWVudChlbGVtZW50cyk7CiAgc3RkOjpjb3V0IDw8ICJFbGVtZW50cyBhZnRlciBzb3J0OlxuIjsKICBTaG93RWxlbWVudChlbGVtZW50cyk7Cn0K