G. Раскраска графа
ограничение по времени на тест
7 секунд
ограничение по памяти на тест
1024 мегабайта
ввод
стандартный ввод
вывод
стандартный вывод

Вам дан двудольный граф, состоящий из $$$n_1$$$ вершин в первой доле и $$$n_2$$$ вершин во второй доле и $$$m$$$ ребер, пронумерованных от $$$1$$$ до $$$m$$$. Вы должны раскрасить каждые ребро в один из двух цветов, красный и синий. Необходимо минимизировать следующее значение: $$$\sum \limits_{v \in V} |r(v) - b(v)|$$$, где $$$V$$$ — множество вершин графа, $$$r(v)$$$ — число красных ребер, инцидентных $$$v$$$, и $$$b(v)$$$ — число синих ребер, инцидентных $$$v$$$.

Звучит классически и просто, не так ли? Ну, вы должны обработать $$$q$$$ запросов следующего формата:

  • $$$1$$$ $$$v_1$$$ $$$v_2$$$ — добавить новое ребро, соединяющее вершину $$$v_1$$$ первой доли с вершиной $$$v_2$$$ второй доли. Это ребро получает новый индекс следующим образом: первое добавленное ребро получает индекс $$$m + 1$$$, второе — $$$m + 2$$$ и так далее. После добавления ребра вы должны вывести хэш текущей оптимальной раскраски (если существует несколько оптимальных раскрасок, выведите хэш любой из них). На самом деле этот хэш не будет проверен, вы можете вывести любое число в качестве ответа на этот запрос, но вас могут попросить предоставить раскраску с этим хэшем;
  • $$$2$$$ — выведите оптимальную раскраску графа с тем же хэшем, который вы вывели при обработке предыдущего запроса. Запрос этого типа будет задан только после запроса типа $$$1$$$, и будет не более $$$10$$$ запросов этого типа. Если существует несколько оптимальных раскрасок, соответствующих этому хэшу, выведите любую из них.

Обратите внимание, что если ребро было красным или синим в какой-то раскраске, оно может изменить свой цвет в следующих раскрасках.

Хэш раскраски вычисляется следующим образом: пусть $$$R$$$ — множество индексов красных ребер, тогда хэш равен $$$(\sum \limits_{i \in R} 2^i) \bmod 998244353$$$.

Обратите внимание, что вы должны решить эту задачу в режиме online. Это означает, что вы не можете считать все входные данные сразу. Вы можете считать каждый запрос только после вывода ответа на последний запрос. Используйте функции fflush в C++ и BufferedWriter.flush в Java после каждого вывода в вашей программе.

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

В первой строке записаны три целых числа $$$n_1$$$, $$$n_2$$$ и $$$m$$$ ($$$1 \le n_1, n_2, m \le 2 \cdot 10^5$$$).

Затем следуют $$$m$$$ строк, в $$$i$$$-й строке записаны два целых числа $$$x_i$$$ и $$$y_i$$$ ($$$1 \le x_i \le n_1$$$; $$$1 \le y_i \le n_2$$$), означающие, что $$$i$$$-е ребро соединяет вершину $$$x_i$$$ из первой доли и вершину $$$y_i$$$ из второй доли.

В следующей строке записано одно целое число $$$q$$$ ($$$1 \le q \le 2 \cdot 10^5$$$) — количество запросов, которые требуется обработать.

В следующих $$$q$$$ строках содержатся запросы в формате, описанном в условии.

Дополнительные ограничения на входные данные:

  • в любой момент времени в графе нет кратных ребер;
  • все запросы типа $$$2$$$ задаются только если предыдущий запрос был типа $$$1$$$;
  • всего не более $$$10$$$ запросов типа $$$2$$$.
Выходные данные

Чтобы ответить на запрос типа $$$1$$$ выведите одно целое число — хэш оптимальной раскраски.

Чтобы ответить на запрос типа $$$2$$$ выведите одну строку. Она должна начинаться с целого числа $$$k$$$ — количество красных ребер. Затем должны идти $$$k$$$ различных целых чисел — номера красных ребер в вашей раскраске в любом порядке. Каждый номер должен соответствовать существующему ребру, а хэш раскраски, которую вы вывели, должен быть равен хэшу, который вы вывели в ответ на прошлый запрос.

Если существует несколько ответов на запрос, то выведите любой из них.

Пример
Входные данные
3 4 2
1 2
3 4
10
1 1 3
1 2 3
2
1 3 3
2
1 2 4
2
1 2 1
1 1 1
2
Выходные данные
8
8
1 3
40
2 3 5
104
3 5 6 3
104
360
4 5 6 3 8