По приведенному вами примеру, можно видеть, что номер квартиры равен ID минус количество изменяемых ID, значение которых меньше или равно текущему.
Т.е.
N(2) = 2 — 0 = 2
N(3) = 3 — |{3}| = 2
N(4) = 4 — |{3}| = 3
N(5) = 5 — |{3, 5}| = 3
Т.е. для каждого запроса номера — сложность ответа будет O(m), где m — число изменяемых ID (можно и быстрее).
Если запросов много, то лучше обновить все сразу. Например так:
Перегенерируем все номера начиная с первого так, что номер очередной квартиры равен значению счетчика. Значение счетчика увеличивается на единицу только если текущий ID не равен одному из изменяемых. Иначе — счетчик не увеличивается.
Итоговая сложность — O(n) при условии, что принадлежность ID списку проверяется за O(1).
Честно говоря, очень долго пытался понять суть проблемы. Решение кажется слишком простым. Возможно, я что-то не правильно понял.