Задача №113269. Дерево

Рассмотрим корневое дерево. Изначально дерево состоит из одного лишь корня. На сыновьях каждой вершины определён порядок слева направо. Допустимые операции с деревом таковы:

  • Добавить в дерево лист.
  • Удалить из дерева лист.
  • Найти количество вершин на пути между двумя листьями.
  • Найти количество вершин "под путём" между двумя листьями.

Множество вершин, лежащих "под путём" между листьями \(u\) и \(v\), определяется следующим образом. Рассмотрим путь \(u = w_0\) - \(w_1\) - \(\ldots\) - \(w_k = v\) между ними. Выделим в нём ту вершину \(w_c\), в которой оба ребра пути идут в её сыновей. Пусть для определённости левое из этих рёбер приближает нас к вершине \(u\), а правое - к вершине \(v\). Тогда лежащими "под путём" объявляются следующие вершины:

  • Все сыновья \(w_c\), лежащие между \(w_{c - 1}\) и \(w_{c + 1}\), а также все вершины их поддеревьев;
  • Для \(i = 1, \, 2, \, \ldots, \, c - 1\) - все сыновья \(w_i\), лежащие правее сына \(w_{i - 1}\), а также все вершины их поддеревьев;
  • Для \(i = c + 1, \, c + 2, \, \ldots, \, k - 1\) - все сыновья \(w_i\), лежащие левее сына \(w_{i + 1}\), а также все вершины их поддеревьев.

Напишите программу, которая по последовательности запросов перестраивает дерево согласно запросам на добавление и удаление вершин, а также вычисляет ответы на запросы о количестве вершин на пути и "под путём".

Формат входных данных

В первой строке ввода содержится одно целое число \(n\) - количество запросов (\(0 \le n \le 300\,000\)). Каждая из следующих \(n\) строк описывает один запрос. Возможные виды запросов таковы:

l \(x\) добавить новый лист как самого левого сына вершины \(x\)
r \(x\) добавить новый лист как самого правого сына вершины \(x\)
a \(x\) \(y\) добавить новый лист как сына вершины \(x\), находящегося непосредственно справа от вершины \(y\); все сыновья \(x\), находившиеся до этого справа от \(y\), после добавления оказываются правее новой вершины; гарантируется, что \(y\) является сыном \(x\)
d \(x\) удалить вершину \(x\); гарантируется, что в этот момент вершина \(x\) не удалена и является листом
p \(x\) \(y\) найти количество вершин на пути между \(x\) и \(y\), включая сами эти вершины; гарантируется, что \(x\) и \(y\) являются листьями
q \(x\) \(y\) найти количество вершин <<под путём>> между \(x\) и \(y\), включая сами эти вершины; гарантируется, что \(x\) и \(y\) являются листьями

Добавляемые вершины нумеруются с единицы в том порядке, в котором они добавляются в запросах. Корень дерева имеет номер \(0\) и листом ни в какой момент времени не считается.

Формат выходных данных
Выполняя запросы по порядку, на каждый запрос вида \t{} или \t{} выведите ответ на него на отдельной строке.
Примеры
Входные данные
10
l 0
r 0
l 1
r 2
a 0 1
r 4
p 6 5
l 2
q 3 6
d 7
Выходные данные
5
2
Сдать: для сдачи задач необходимо войти в систему