Вам дан двудольный граф, состоящий из $$$n_1$$$ вершин в первой доле и $$$n_2$$$ вершин во второй доле и $$$m$$$ ребер, пронумерованных от $$$1$$$ до $$$m$$$. Вы должны раскрасить каждые ребро в один из двух цветов, красный и синий. Необходимо минимизировать следующее значение: $$$\sum \limits_{v \in V} |r(v) - b(v)|$$$, где $$$V$$$ — множество вершин графа, $$$r(v)$$$ — число красных ребер, инцидентных $$$v$$$, и $$$b(v)$$$ — число синих ребер, инцидентных $$$v$$$.
Звучит классически и просто, не так ли? Ну, вы должны обработать $$$q$$$ запросов следующего формата:
Обратите внимание, что если ребро было красным или синим в какой-то раскраске, оно может изменить свой цвет в следующих раскрасках.
Хэш раскраски вычисляется следующим образом: пусть $$$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$$$ строках содержатся запросы в формате, описанном в условии.
Дополнительные ограничения на входные данные:
Чтобы ответить на запрос типа $$$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
Название |
---|