fn main() {
let x = vec![1, 1, 2, 3, 5, 5, 8, 13];
fn bis<P>(ok: i64, ng: i64, p: P) -> i64
where P: Fn(i64) -> bool {
let mid = (ok + ng) / 2;
if (ok
- ng
).
abs() == 1 { ok
} else if p(mid) {
bis(mid, ng, p)
} else {
bis(ok, mid, p)
}
}
let i = bis(x.len() as i64, -1, |i| x[i as usize] >= 5);
println!("i = {}", i);
let j = bis(x.len() as i64, -1, |i| x[i as usize] > 5);
println!("j = {}", j);
}
Zm4gbWFpbigpIHsKICAgIGxldCB4ID0gdmVjIVsxLCAxLCAyLCAzLCA1LCA1LCA4LCAxM107CiAgICBmbiBiaXM8UD4ob2s6IGk2NCwgbmc6IGk2NCwgcDogUCkgLT4gaTY0CiAgICAgICAgd2hlcmUgUDogRm4oaTY0KSAtPiBib29sIHsKICAgICAgICBsZXQgbWlkID0gKG9rICsgbmcpIC8gMjsKICAgICAgICBpZiAob2sgLSBuZykuYWJzKCkgPT0gMSB7CiAgICAgICAgICAgIG9rCiAgICAgICAgfSBlbHNlIGlmIHAobWlkKSB7CiAgICAgICAgICAgIGJpcyhtaWQsIG5nLCBwKQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGJpcyhvaywgbWlkLCBwKQogICAgICAgIH0KICAgIH0KICAgIGxldCBpID0gYmlzKHgubGVuKCkgYXMgaTY0LCAtMSwgfGl8IHhbaSBhcyB1c2l6ZV0gPj0gNSk7CiAgICBwcmludGxuISgiaSA9IHt9IiwgaSk7CiAgICBsZXQgaiA9IGJpcyh4LmxlbigpIGFzIGk2NCwgLTEsIHxpfCB4W2kgYXMgdXNpemVdID4gNSk7CiAgICBwcmludGxuISgiaiA9IHt9Iiwgaik7Cn0=