#include <cassert>
#include <iostream>
#include <vector>
bool CanReachEnd(std::vector<int> const & jumps)
{
assert(jumps.size() > 0);
std::size_t current = jumps.size() - 1;
std::size_t lowest_can_reach_end = current;
while (true)
{
assert(jumps[current] >= 0);
if (current + jumps[current] >= lowest_can_reach_end)
{
lowest_can_reach_end = current;
}
if (current == 0) break;
current -= 1;
}
assert(current == 0);
return (lowest_can_reach_end == 0);
}
int main() {
std::vector<int> jumps[] = {
{1, 2, 1, 3, 0, 0, 2, 3, 1},
{1, 2, 1, 2, 0, 0, 2, 3, 1},
{0},
{1},
{0,1},
{1,1}
};
for (auto const & j : jumps)
{
if (CanReachEnd(j))
{
std::cout << "Can reach end\n";
}
else
{
std::cout << "Cannot reach end\n";
}
}
}
I2luY2x1ZGUgPGNhc3NlcnQ+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KCgpib29sIENhblJlYWNoRW5kKHN0ZDo6dmVjdG9yPGludD4gY29uc3QgJiBqdW1wcykKewoJYXNzZXJ0KGp1bXBzLnNpemUoKSA+IDApOwoJc3RkOjpzaXplX3QgY3VycmVudCA9IGp1bXBzLnNpemUoKSAtIDE7CglzdGQ6OnNpemVfdCBsb3dlc3RfY2FuX3JlYWNoX2VuZCA9IGN1cnJlbnQ7Cgl3aGlsZSAodHJ1ZSkKCXsKCQlhc3NlcnQoanVtcHNbY3VycmVudF0gPj0gMCk7CgkJaWYgKGN1cnJlbnQgKyBqdW1wc1tjdXJyZW50XSA+PSBsb3dlc3RfY2FuX3JlYWNoX2VuZCkKCQl7CgkJCWxvd2VzdF9jYW5fcmVhY2hfZW5kID0gY3VycmVudDsKCQl9CgkJaWYgKGN1cnJlbnQgPT0gMCkgYnJlYWs7CgkJY3VycmVudCAtPSAxOwoJfQoJYXNzZXJ0KGN1cnJlbnQgPT0gMCk7CglyZXR1cm4gKGxvd2VzdF9jYW5fcmVhY2hfZW5kID09IDApOwp9CgppbnQgbWFpbigpIHsKCXN0ZDo6dmVjdG9yPGludD4ganVtcHNbXSA9IHsKCQl7MSwgMiwgMSwgMywgMCwgMCwgMiwgMywgMX0sCgkJezEsIDIsIDEsIDIsIDAsIDAsIDIsIDMsIDF9LAoJCXswfSwKCQl7MX0sCgkJezAsMX0sCgkJezEsMX0KCX07Cglmb3IgKGF1dG8gY29uc3QgJiBqIDoganVtcHMpCgl7CgkJaWYgKENhblJlYWNoRW5kKGopKQoJCXsJCgkJCXN0ZDo6Y291dCA8PCAiQ2FuIHJlYWNoIGVuZFxuIjsgCgkJfQoJCWVsc2UKCQl7CgkJCXN0ZDo6Y291dCA8PCAiQ2Fubm90IHJlYWNoIGVuZFxuIjsKCQl9Cgl9Cn0=