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

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}.
Ліміт часу 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