eolymp
bolt
Try our new interface for solving problems
Problems

Persistent List

Persistent List

Заданы \textbf{n }списков, каждый из которых состоит из одного элемента. Необходимо научиться совершать следующие операции: \begin{itemize} \item \textbf{merge} --- взять два каких-то уже существующих списка и породить новый, равный их конкатенации. \item \textbf{head} --- взять какой-то уже существующий список \textbf{L} и породить два новых, в одном первый элемент \textbf{L}, во втором весь \textbf{L} кроме первого элемента. \item \textbf{tail} --- взять какой-то уже существующий список \textbf{L} и породить два новых, в одном весь \textbf{L} кроме последнего элемента, во втором последний элемент \textbf{L}. \end{itemize} Для свежесозданных списков нужно говорить сумму элементов в них по модулю \textbf{10^9 + 7}. \InputFile Число \textbf{n }(\textbf{1 }≤ \textbf{n }≤ \textbf{10^5}). Далее \textbf{n }целых чисел от \textbf{1 }до \textbf{10^9} - элементы списков. Исходные списки имеют номера \textbf{1}, \textbf{2}, ..., \textbf{n}. Затем число \textbf{m }(\textbf{1 }≤ \textbf{m }≤ \textbf{10^5}) - количество операций. Далее даны операции в следующем формате: \begin{itemize} \item \textbf{merge i j} \item \textbf{head i} \item \textbf{tail i} \end{itemize} где \textbf{i }и \textbf{j }- номера уже существующих списков. Если в текущий момент имеется \textbf{k} списков, новый список получает номер \textbf{k+1}. Для операций \textbf{head }и \textbf{tail} считается, что сперва порождается левая часть, затем правая (см. пример). Также Вам гарантируется, что никогда не будут порождаться пустые списки. \OutputFile Для каждого нового списка нужно вывести сумму элементов по модулю \textbf{10^9 + 7}.
Time limit 2 seconds
Memory limit 256 MiB
Input example #1
4
1 2 3 4
7
merge 1 2
merge 3 4
merge 6 5
head 7
tail 9
merge 2 3
merge 1 1
Output example #1
3
7
10
3
7
5
2
5
2