Для удобства каждый адрес будем кодировать числом от 0 до 264 - 1 (то есть беззнаковым 64-битным числом) следующим образом: encode(a1.a2.a3.... .ax) = a1·256x - 1 + a2·256x - 2 + ... + ax - 1·256 + ax.
Теперь посмотрим на отрезок encode(a)..encode(b). Ответ существует, если на этом отрезке есть два подряд свободных адреса. Чтобы понять это, найдем все адреса на этом отрезке, отсортируем их и проверим за O(n) этот факт. И если ответ существует, то он равен encode(b) - encode(a) - between - 1, так как все остальные адреса на отрезке надо заполнить. Здесь за between обозначено количество занятых адресов, лежащих между a и b.