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

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}.
Ліміт часу 2 секунди
Ліміт використання пам'яті 256 MiB
Вхідні дані #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
Автор Сергій Копеліович
Джерело Зимова Школа, Харків 2011, День 5