Здравствуйте, Аноним, Вы писали:
А>Столкнулся с такой задачей в некую функцию добавляют/ удаляют прямоугольники заданный двумя точками X1Y1 (верхний, левый) и X2Y2 (нижний правый).
А>void Add(X1, Y1, X2, Y2); А>void Remove(X1, Y1, X2, Y2);
Удаляются только те прямоугольники, которые уже были добавлены? Если это так, то просто заведи пару сбалансированных деревьев поиска, например. При добавлении прямоугольника добавляешь в одно дерево ключи x1 и x2, а в другое дерево ключи y1 и y2. При удалении просто исключаешь из деревьев соответствующие ключи. Обрамляющий прямоугольник находится из наименьшего и наибольшего значения ключей из обоих деревьев. Дублирующиеся ключи в деревьях можно хранить либо многократно, либо в комбинации "уникальный ключ" + счётчик.
Если удаляться могут не только добавленные прямоугольники, и нужно определять такую ситуацию (например, сообщая об невозможности удаления), то можно несложно изменить структуру данных и для такого случая — в дереве сделать ключи уникальными, а в данных, связанных с ключом, хранить множество уникальных идентификаторов для добавленных прямоугольников. Тогда при вызове удаления можно будет определить, добавлялся ранее такой прямоугольник или нет.