Задачи
CHM
CHM
Ваша задача --- реализовать \textbf{Persistent Disjoint-Set-Union}. Что это значит?
Про \textbf{Disjoint-Set-Union}:
Изначально у вас есть \textbf{n} элементов. Нужно научиться отвечать на \textbf{2} типа запросов.
\begin{itemize}
\item \textbf{+ a b} --- объединить множества, в которых лежат вершины \textbf{a} и \textbf{b};
\item \textbf{? a b} --- сказать, лежат ли вершины \textbf{a} и \textbf{b} сейчас в одном множестве.
\end{itemize}
Про \textbf{Persistent}:
Теперь у нас будет несколько копий (версий) структуры данных \textbf{Disjoint-Set-Union}.
Запросы будут выглядеть так:
\begin{itemize}
\item \textbf{+ i a b} --- запрос к \textbf{i}-й структуре, объединить множества, в которых лежат вершины \textbf{a} и \textbf{b}. При этом \textbf{i}-я структура остается неизменной, создается новая версия, ей присваивается новый номер (какой? читайте дальше);
\item \textbf{? i a b} --- запрос к \textbf{i}-й структуре, сказать, лежат ли вершины \textbf{a} и \textbf{b} сейчас в одном множестве.
\end{itemize}
\InputFile
На первой строке \textbf{2} числа \textbf{N} (\textbf{1} ≤ \textbf{N} ≤ \textbf{10^5}) и \textbf{K} (\textbf{0} ≤ \textbf{K} ≤ \textbf{10^5}) --- число элементов и число запросов. Изначально все элементы находятся в различных множествах. Эта изначальная копия (версия) структуры имеет номер \textbf{0}.
Далее следуют \textbf{K} строк, на каждой описание очередного запроса. Формат запросов описан выше. Запросы нумеруются целыми числами от \textbf{1} до \textbf{K}.
При обработке \textbf{j}-го запроса вида \textbf{+ i a b}, новая версия получит номер \textbf{j}.
Запросов к несуществующим версиям не будет (\textbf{j} > \textbf{i}).
\OutputFile
Для каждого запроса вида \textbf{? i a b} на отдельной строке нужно вывести \textbf{YES} или \textbf{NO}.
Входные данные #1
4 7 + 0 1 2 ? 0 1 2 ? 1 1 2 + 1 2 3 ? 4 3 1 ? 0 4 4 ? 4 1 4
Выходные данные #1
NO YES YES YES NO