eolymp
bolt
Попробуйте наш новый интерфейс для отправки задач
Задачи

Персистентный список

Персистентный список

Заданы \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}.
Лимит времени 2 секунды
Лимит использования памяти 256 MiB
Входные данные #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
Выходные данные #1
3
7
10
3
7
5
2
5
2