Лучший способ решить это - построить дерево интервалов. (Дерево диапазона, заданное sza, является статическим, что означает, что после его создания вы не можете добавлять/удалять узлы. Если это нормально, то его ответа будет достаточно.)
Здесь вы можете узнать о дереве интервалов:
Youtube: https://www.youtube.com/watch?v=q0QOYtSsTg4
Wiki: https://en.wikipedia.org/wiki/Interval_tree
интервал дерево в основном бинарное дерево на основе левого значения диапазона кортежа. ([влево, вправо]) Что особенного в том, что каждый узел в дереве имеет значение с именем max. Максимальное значение имеет наибольшее правое значение узлов, которые находятся ниже этого узла, включая сам узел. Другими словами, текущий узел будет иметь максимальное значение, установленное в самое большое правое значение поддерева, которым текущий узел является корнем.
Чтобы развернуть это для вашей проблемы, мы можем добавить и минимальное значение. Если значение min будет содержать наименьшее левое значение всего поддерева, где этот узел является корнем.
Edited ScreenCap из видео: (извините за качество)
Это означает, что, когда мы делаем запрос на номер, который вы:
1) add current node to set of answers if number is inside range
2) go left if number is less than max value of left child.
3) go right if number is greater than min value of right child.
Каков максимальный диапазон чисел в диапазоне входных? В списке номеров для поиска? Все ли они целые? – Paddy3118