Задачі
Connect and Disconnect
Connect and Disconnect
Чи знаєте Ви що-небудь про DFS, Depth First Search, пошук у глибину?
Наприклад, використовуючи цей метод, можна перевірити зв'язність графа за час \textbf{O}(\textbf{E}). Можна навіть за той же самий час порахувати кількість компонент зв'язності графа.
Чи знаєте Ви що-небудь про DSU, Disjoint Set Union, систему множин, що не перетинаються? Використовуючи цю структуру даних, Ви можете опрацьовувати запити виду "Додати ребро у граф" і "Порахувати кількість компонент зв'язності графа" швидко. Тобто обидва запити за \textbf{O}(\textbf{log N}).
А чи знаєте Ви що-небудь про Dynamic Connectivity Problem? У цій задачі, вам потрібно вміти швидко опрацьовувати \textbf{3} типи запитів:
\begin{enumerate}
\item Додати ребро в граф.
\item Видалити ребро з графа.
\item Порахувати кількість компонент зв'язності графа.
\end{enumerate}
\InputFile
На початку граф пустий.
Перший рядок вхідного файлу містить \textbf{2} числа --- \textbf{N} і \textbf{K} --- кількість вершин і кількість запитів (\textbf{1} ≤ \textbf{N} ≤ \textbf{300000}, \textbf{0} ≤ \textbf{K} ≤ \textbf{300000}).
Наступні \textbf{K} містять запити, по одному у рядку. Є \textbf{3} типи запитів:
\begin{enumerate}
\item \textbf{+ u v}: додати ребро між вершинами \textbf{u} і \textbf{v}. Гарантується, що у момент отримання запиту такого ребра у графі немає.
\item \textbf{- u v}: видалити ребро між вершинами \textbf{u} і \textbf{v}. Гарантується, що у момент отримання запиту таке ребро у графі єь.
\item \textbf{?}: порахувати кількість компонент зв'язності у графі на поточний момент.
\end{enumerate}
Вершини нумеруються від \textbf{1} до \textbf{N}. Немає запитів з \textbf{u} = \textbf{v}. Граф неорієнтовний.
\OutputFile
Для кожного запиту виду '\textbf{?}' виведіть кількість компонент зв'язності графа у момент часу запиту у окремому рядку.
Вхідні дані #1
5 11 ? + 1 2 + 2 3 + 3 4 + 4 5 + 5 1 ? - 2 3 ? - 4 5 ?
Вихідні дані #1
5 1 1 2