#include <stdio.h>
#define nearest(a, x) _nearest(a, sizeof(a) / sizeof(a[0]), x)
int _nearest(int a[], int n, int x)
{
int L = 0, C, R = n - 1;
while (L + 1 < R) {
C = (L + R) / 2;
a[C] < x ? (L = C) : (R = C);
}
return x - a[L] <= a[R] - x ? a[L] : a[R];
}
int main(void)
{
int a[] = {98, 100, 198, 200, 250, 298};
printf("%d -> %d\n", 50, nearest
(a
, 50)); printf("%d -> %d\n", 195, nearest
(a
, 195));
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgojZGVmaW5lIG5lYXJlc3QoYSwgeCkgX25lYXJlc3QoYSwgc2l6ZW9mKGEpIC8gc2l6ZW9mKGFbMF0pLCB4KQoKaW50IF9uZWFyZXN0KGludCBhW10sIGludCBuLCBpbnQgeCkKewogICAgaW50IEwgPSAwLCBDLCBSID0gbiAtIDE7CgogICAgd2hpbGUgKEwgKyAxIDwgUikgewogICAgICAgIEMgPSAoTCArIFIpIC8gMjsKICAgICAgICBhW0NdIDwgeCA/IChMID0gQykgOiAoUiA9IEMpOwogICAgfQoKICAgIHJldHVybiB4IC0gYVtMXSA8PSBhW1JdIC0geCA/IGFbTF0gOiBhW1JdOwp9CgppbnQgbWFpbih2b2lkKQp7CiAgICBpbnQgYVtdID0gezk4LCAxMDAsIDE5OCwgMjAwLCAyNTAsIDI5OH07CgogICAgcHJpbnRmKCIlZCAtPiAlZFxuIiwgNTAsIG5lYXJlc3QoYSwgNTApKTsKICAgIHByaW50ZigiJWQgLT4gJWRcbiIsIDE5NSwgbmVhcmVzdChhLCAxOTUpKTsKCiAgICByZXR1cm4gMDsKfQ==