#include <cassert>
#include <functional>
int floorCeilImpl(const std::function<bool (int, int)> &comparator,
const std::function<int (int, int)> &operation,
double x) {
const int int_part = static_cast<int>(x);
if (comparator(int_part, 0)) {
return int_part;
} else {
return operation(int_part, (x != int_part));
}
}
int floor(double x) {
return floorCeilImpl(std::greater_equal<int>(), std::minus<int>(), x);
}
int ceil(double x) {
return floorCeilImpl(std::less<int>(), std::plus<int>(), x);
}
int main() {
assert(ceil(0.0) == 0);
assert(floor(0.0) == 0);
assert(ceil(1.0) == 1);
assert(floor(1.0) == 1);
assert(ceil(-1.0) == -1);
assert(floor(-1.0) == -1);
assert(ceil(1.2) == 2);
assert(floor(1.2) == 1);
assert(ceil(-1.2) == -1);
assert(floor(-1.2) == -2);
return 0;
}
I2luY2x1ZGUgPGNhc3NlcnQ+CiNpbmNsdWRlIDxmdW5jdGlvbmFsPgoKaW50IGZsb29yQ2VpbEltcGwoY29uc3Qgc3RkOjpmdW5jdGlvbjxib29sIChpbnQsIGludCk+ICZjb21wYXJhdG9yLAogICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPGludCAoaW50LCBpbnQpPiAmb3BlcmF0aW9uLAogICAgICAgICAgICAgICAgICBkb3VibGUgeCkgewoKICBjb25zdCBpbnQgaW50X3BhcnQgPSBzdGF0aWNfY2FzdDxpbnQ+KHgpOwogIAogIGlmIChjb21wYXJhdG9yKGludF9wYXJ0LCAwKSkgewogICAgcmV0dXJuIGludF9wYXJ0OwogIH0gZWxzZSB7CiAgICByZXR1cm4gb3BlcmF0aW9uKGludF9wYXJ0LCAoeCAhPSBpbnRfcGFydCkpOwogIH0KCn0KCmludCBmbG9vcihkb3VibGUgeCkgewogIHJldHVybiBmbG9vckNlaWxJbXBsKHN0ZDo6Z3JlYXRlcl9lcXVhbDxpbnQ+KCksIHN0ZDo6bWludXM8aW50PigpLCB4KTsgIAp9CgppbnQgY2VpbChkb3VibGUgeCkgewogIHJldHVybiBmbG9vckNlaWxJbXBsKHN0ZDo6bGVzczxpbnQ+KCksIHN0ZDo6cGx1czxpbnQ+KCksIHgpOyAgCn0KCmludCBtYWluKCkgewogIGFzc2VydChjZWlsKDAuMCkgPT0gMCk7CiAgYXNzZXJ0KGZsb29yKDAuMCkgPT0gMCk7CiAgCiAgYXNzZXJ0KGNlaWwoMS4wKSA9PSAxKTsKICBhc3NlcnQoZmxvb3IoMS4wKSA9PSAxKTsKICAKICBhc3NlcnQoY2VpbCgtMS4wKSA9PSAtMSk7CiAgYXNzZXJ0KGZsb29yKC0xLjApID09IC0xKTsKICAKICBhc3NlcnQoY2VpbCgxLjIpID09IDIpOwogIGFzc2VydChmbG9vcigxLjIpID09IDEpOwogIAogIGFzc2VydChjZWlsKC0xLjIpID09IC0xKTsKICBhc3NlcnQoZmxvb3IoLTEuMikgPT0gLTIpOwogIAogIHJldHVybiAwOwp9