Я думаю, что все, что нужно, это ключевой класс, где hashCode () и equals () делают то, что вы хотите, чтобы они делали. Я подозреваю, что вы можете столкнуться с проблемой, когда A перекрывает B (то есть A.equals (B) == true), B перекрывает C, но C не перекрывает A. Если вы реализуете такой метод equals (), вы будете возможно странное поведение
По сути, вы хотите сделать что-то вроде колотых запросов в дереве сегментов (т.е. для всех перекрывающихся интервалов E для интервала (p1.start, p1.end), выполнить колющие запросы для p1.start и p1.end).
Но в основном нет, я не знаю правильного ответа на ваш вопрос. Но, возможно, запрос для "Дерево сегментов" hadoop поможет вам начать.