#include <iostream>
#include <algorithm>
#include <vector>
template <class It, class Less>
bool almost_increasing_seq(It begin, It end, Less cmp) {
const auto lbound = std::adjacent_find(begin, end, std::not2(cmp));
if (lbound == end) {
return true; // already sorted
}
const auto rbound = lbound + 1;
if (rbound == end || (rbound + 1) == end) {
return true; // can just drop the last one
}
return std::adjacent_find(rbound, end, std::not2(cmp)) == end &&
(lbound == begin || cmp(*lbound, *(rbound + 1)) ||
cmp(*(lbound - 1), *rbound));
}
bool almost_increasing_vector(const std::vector<int>& ints) {
return almost_increasing_seq(ints.begin(), ints.end(), std::less<int>());
}
int main() {
std::cout << "[] => " << almost_increasing_vector({}) << "\n";
std::cout << "[0, 1] => " << almost_increasing_vector({0, 1}) << "\n";
std::cout << "[1, 0] => " << almost_increasing_vector({1, 0}) << "\n";
std::cout << "[0, 1, 2, 3] => " << almost_increasing_vector({0, 1, 2, 3}) << "\n";
std::cout << "[5, 1, 2, 3] => " << almost_increasing_vector({5, 1, 2, 3}) << "\n";
std::cout << "[1, 2, 0, 3] => " << almost_increasing_vector({1, 2, 0, 3}) << "\n";
std::cout << "[1, 5, 2, 3] => " << almost_increasing_vector({1, 5, 2, 3}) << "\n";
std::cout << "[1, 5, 0, 2] => " << almost_increasing_vector({1, 5, 0, 2}) << "\n";
std::cout << "[3, 2, 1, 0] => " << almost_increasing_vector({3, 2, 1, 0}) << "\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8dmVjdG9yPgoKdGVtcGxhdGUgPGNsYXNzIEl0LCBjbGFzcyBMZXNzPgpib29sIGFsbW9zdF9pbmNyZWFzaW5nX3NlcShJdCBiZWdpbiwgSXQgZW5kLCBMZXNzIGNtcCkgewogIGNvbnN0IGF1dG8gbGJvdW5kID0gc3RkOjphZGphY2VudF9maW5kKGJlZ2luLCBlbmQsIHN0ZDo6bm90MihjbXApKTsKICBpZiAobGJvdW5kID09IGVuZCkgewogICAgcmV0dXJuIHRydWU7IC8vIGFscmVhZHkgc29ydGVkCiAgfQogIGNvbnN0IGF1dG8gcmJvdW5kID0gbGJvdW5kICsgMTsKICBpZiAocmJvdW5kID09IGVuZCB8fCAocmJvdW5kICsgMSkgPT0gZW5kKSB7CiAgICByZXR1cm4gdHJ1ZTsgLy8gY2FuIGp1c3QgZHJvcCB0aGUgbGFzdCBvbmUKICB9CiAgcmV0dXJuIHN0ZDo6YWRqYWNlbnRfZmluZChyYm91bmQsIGVuZCwgc3RkOjpub3QyKGNtcCkpID09IGVuZCAmJgogICAgICAgICAobGJvdW5kID09IGJlZ2luIHx8IGNtcCgqbGJvdW5kLCAqKHJib3VuZCArIDEpKSB8fAogICAgICAgICAgY21wKCoobGJvdW5kIC0gMSksICpyYm91bmQpKTsKfQoKYm9vbCBhbG1vc3RfaW5jcmVhc2luZ192ZWN0b3IoY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgaW50cykgewogIHJldHVybiBhbG1vc3RfaW5jcmVhc2luZ19zZXEoaW50cy5iZWdpbigpLCBpbnRzLmVuZCgpLCBzdGQ6Omxlc3M8aW50PigpKTsKfQoKaW50IG1haW4oKSB7CiAgc3RkOjpjb3V0IDw8ICJbXSA9PiAiIDw8IGFsbW9zdF9pbmNyZWFzaW5nX3ZlY3Rvcih7fSkgPDwgIlxuIjsKICBzdGQ6OmNvdXQgPDwgIlswLCAxXSA9PiAiIDw8IGFsbW9zdF9pbmNyZWFzaW5nX3ZlY3Rvcih7MCwgMX0pIDw8ICJcbiI7CiAgc3RkOjpjb3V0IDw8ICJbMSwgMF0gPT4gIiA8PCBhbG1vc3RfaW5jcmVhc2luZ192ZWN0b3IoezEsIDB9KSA8PCAiXG4iOwogIHN0ZDo6Y291dCA8PCAiWzAsIDEsIDIsIDNdID0+ICIgPDwgYWxtb3N0X2luY3JlYXNpbmdfdmVjdG9yKHswLCAxLCAyLCAzfSkgPDwgIlxuIjsKICBzdGQ6OmNvdXQgPDwgIls1LCAxLCAyLCAzXSA9PiAiIDw8IGFsbW9zdF9pbmNyZWFzaW5nX3ZlY3Rvcih7NSwgMSwgMiwgM30pIDw8ICJcbiI7CiAgc3RkOjpjb3V0IDw8ICJbMSwgMiwgMCwgM10gPT4gIiA8PCBhbG1vc3RfaW5jcmVhc2luZ192ZWN0b3IoezEsIDIsIDAsIDN9KSA8PCAiXG4iOwogIHN0ZDo6Y291dCA8PCAiWzEsIDUsIDIsIDNdID0+ICIgPDwgYWxtb3N0X2luY3JlYXNpbmdfdmVjdG9yKHsxLCA1LCAyLCAzfSkgPDwgIlxuIjsKICBzdGQ6OmNvdXQgPDwgIlsxLCA1LCAwLCAyXSA9PiAiIDw8IGFsbW9zdF9pbmNyZWFzaW5nX3ZlY3Rvcih7MSwgNSwgMCwgMn0pIDw8ICJcbiI7CiAgc3RkOjpjb3V0IDw8ICJbMywgMiwgMSwgMF0gPT4gIiA8PCBhbG1vc3RfaW5jcmVhc2luZ192ZWN0b3IoezMsIDIsIDEsIDB9KSA8PCAiXG4iOwogIHJldHVybiAwOwp9Cg==