Автор задачи: Ильдар Гайнуллин, разработчик: Антон Вдовин
У этой задачи много решений — DCP Offline, корневые декомпозиции и другие, но мы рассмотрим авторское решение, без сложных идей и структур.
Будем хранить все точки в std::set. Давайте поддерживать прямые между парами соседних точек в текущем множестве в другом std::multiset. При добавлении точки добавится и одна новая прямая (если это не единственная точка в множестве). При удалении точки может удалится две прямые и добавиться новая или же просто удалиться одна прямая. После каждого изменения множества точек достаточно посмотреть, что максимальный элемент в мультимножестве прямых совпадает с минимальным элементом (это означает, что все линии, которые мы провели между парами соседних по добавлению точек, являются одинаковыми, то есть все точки лежат на одной прямой). Для этого также нужно уметь хэшировать прямые (потому что разные тройки коэффициентов могут давать одни и те же прямые), что является общеизвестной задачей и остается на упражнение читателю.