Распределенная Матрица

아직 제출이 없습니다시간 제한1초메모리 제한1024 MB

문제

В условиях нехватки энергии Матрица была модифицирована, чтобы расходовать как можно меньше энергетических ресурсов. Всего есть nn узлов Матрицы с уникальными номерами от 11 до nn. Изначально энергия есть только в генераторе, который является узлом с номером 11.

Требующие энергии узлы постепенно подключаются к уже запитанным узлам, и начинают получать энергию от них, образуя сеть питания в виде дерева. Некоторые узлы могут отказывать и восстанавливаться спустя время после отказа. Уже подключенный к сети узел никогда не переподключается к другим узлам, даже если какой-то из косвенно питающих его узлов отказал.

Ненадежностью узла называется время, прошедшее с момента его последнего восстановления (либо с момента подключения этого узла к сети, если он еще не отказывал). Временем подключения генератора считается момент времени 00.

Требуется обработать mm событий. Событие номер ii происходит ровно спустя ii секунд от начала и может быть одного из следующих видов:

  • <<! x_ix\_i y_iy\_i>> --- узел y_iy\_i подключается к узлу x_ix\_i и начинает получать энергию от него;
  • <<- x_ix\_i>> --- узел x_ix\_i отказывает и перестает проводить энергию;
  • <<+ x_ix\_i>> --- ранее отказавший узел x_ix\_i восстанавливается и продолжает проводить энергию;
  • <<? x_ix\_i y_iy\_i>> --- требуется выяснить, насколько надежна пара узлов x_ix\_i и y_iy\_i.

Для ответа на запрос последнего типа требуется проверить, получают ли энергию оба узла x_ix\_i и y_iy\_i. Узел получает энергию, если сам подключен к сети, и все узлы на пути от генератора до него включительно находятся в исправном состоянии (не отказали). Если оба узла x_ix\_i и y_iy\_i получают энергию, требуется вывести суммарную ненадежность всех узлов, от которых зависит работа хотя бы одного из узлов x_ix\_i или y_iy\_i (то есть узлов, расположенных на путях от них до генератора).

입력

В первой строке ввода через пробел даны два целых числа nn и mm --- общее количество узлов, которым требуется питание, и количество событий, которые надо обработать (2n,m21052 \leqslant n, m \leqslant 2 \cdot 10^5).

В ii-й из следующих mm строк дано описание ii-го запроса (который происходит в момент времени ii). Описание формата запросов дано в условии. За символом, обозначающим тип запроса, в зависимости от этого типа, следует либо одно целое число x_ix\_i, либо два целых числа x_ix\_i и y_iy\_i, разделенные пробелом --- номера задействованных в запросе узлов (1x_i,y_in1 \leqslant x\_i, y\_i \leqslant n; x_iy_ix\_i \neq y\_i).

Гарантируется, что в запросе первого типа узел x_ix\_i уже подключен к сети, а y_iy\_i --- нет. Также для запросов второго и третьего типа гарантируется, что узел x_ix\_i отказывает только если был до этого исправен, и наоборот, восстанавливается только после соответствующего отказа.

출력

После каждого запроса четвертого типа следует в отдельной строке вывести ответ на этот запрос. Если хотя бы один из узлов x_ix\_i и y_iy\_i не получает энергию, следует вывести <<-1>> (без кавычек). Если же оба узла получают энергию, следует вывести целое число, равное сумме ненадежностей всех узлов, лежащих на путях от генератора до x_ix\_i и y_iy\_i.

힌트

В первом примере отказ третьего узла, очевидно, влечет ответ <<-1>> на второй запрос <<? 2 3>>. Ответ на первый запрос равен 66, так как с момента подключения к сети генератора, второго узла и третьего, прошли 33, 22 и 11 секунда, соответственно. В момент третьего запроса с момента подключения генератора и второго узла прошло 77 и 66 секунд, соответственно, тогда как третий узел вернулся в строй ровно 11 секунду назад, что дает ответ 1414.

Во втором примере отказ второго узла аналогично влечет ответ <<-1>> на второй запрос. Ответ на первый запрос вычисляется так же, как и в первом примере, а на третий --- как 7+1+5=137 + 1 + 5 = 13.