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