Задачі
CHM
CHM
Ваше завдання --- реалізувати \textbf{Persistent Disjoint-Set-Union}. Що це означає?
Про \textbf{Disjoint-Set-Union}:
Спочатку у вас є \textbf{n} елементів. Потрібно навчитись відповідати на \textbf{2} типи запитів.
\begin{itemize}
\item + a b --- об'єднати множини, у яких лежать вершины \textbf{a} та \textbf{b};
\item ? 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