Олимпиадный тренинг

Задача . F. Сделай симметричным


Задача

Темы: Перебор *2900

Рассмотрим множество точек \(A\), изначально пустое. Есть три типа запросов:

  1. Добавить точку \((x_i, y_i)\) в множество \(A\). Гарантируется, что эта точка не принадлежит \(A\) в данный момент.
  2. Удалить точку \((x_i, y_i)\) из \(A\). Гарантируется, что эта точка принадлежит \(A\) в данный момент.
  3. Дана точка \((x_i, y_i)\), нужно найти минимальное количество точек, которые нужно добавить в множество \(A\) для того, чтобы сделать \(A\) симметричным относительно прямой, проходящей через точки \((0, 0)\) и \((x_i, y_i)\). Обратите внимание, что эти точки на самом деле не добавляются в \(A\), то есть запросы независимы друг от друга.
Входные данные

Первая строка содердит одно целое число \(q\) (\(1 \le q \le 2 \cdot 10^5\)) — количество запросов.

Каждая из следующих \(q\) описывает запрос и содержит три целых числа \(t_i\), \(x_i\) и \(y_i\) (\( t_i \in \{1, 2, 3\}\), \(1 \le x_i, y_i \le 112\,904\)) — тип запроса и координаты точек. Тип \(1\) — это добавление точки, тип \(2\) — удаление точек, а тип \(3\) — это запрос на подсчёт минимального количества точек, необходимого для того, чтобы сделать \(A\) симметричным.

Гарантируется, что дано не более \(10^5\) запросов типа \(3\) и не более \(10^5\) запросов типов \(1\) и \(2\) суммарно.

Выходные данные

Для каждого запроса третьего типа выведите одно целое число в отдельной строке — ответ на запрос.

Примечание

Первый пример показан на рисунке ниже.


Примеры
Входные данныеВыходные данные
1 12
1 1 6
1 6 1
1 5 5
1 2 3
3 4 4
1 3 2
3 7 7
2 2 3
2 6 1
3 8 8
2 5 5
3 1 1
1
0
2
2
2 6
1 1 2
3 1 1
1 1 1
3 2 2
2 1 1
3 2 4
1
1
0

time 6000 ms
memory 512 Mb
Правила оформления программ и список ошибок при автоматической проверке задач

Статистика успешных решений по компиляторам
 Кол-во
С++ Mingw-w645
Комментарий учителя