int binary_search(const unsigned *a, int n, unsigned x)
{
int l = 0, r = n - 1, mid = (l + r) / 2;
while (l < r - 1) {
if (x > a[mid]) l = mid;
else r = mid;
mid = (l + r) / 2;
}
if (x > a[r]) return r + 1;
else if (x > a[l]) return r;
else return l;
}