Задачі
З`єднання та роз`єднання
З`єднання та роз`єднання
Ви коли-небудь чули про обхід в глибину? Наприклад, використовуючи цей алгоритм, ви можете перевірити, чи є граф зв'язним, за час \textbf{O(E)}. Ви можете навіть порахувати кількість компонент зв'язності за цей же час.
А ви коли-небудь чули про систему множин, які не перетинаються? Використовуючи цю структуру, ви можете швидко опрацьовувати запити "Додати ребро в граф" та "Порахувати кількість компонент зв'язності у графі".
А ви коли-небудь чули про динамічну задачі зв'язності? У цій задачі вам потрібно опрацьовувати три типи запитів:
\begin{enumerate}
\item Додати ребро в граф.
\item Видалити ребро з графа.
\item Порахувати кількість компонент зв'язності у графі.
\end{enumerate}
\InputFile
Спочатку граф порожній.
У першому рядку знаходяться два цілих числа \textbf{N} та \textbf{K} - кількість вершин та кількість запитів відповідно (\textbf{1} ≤ \textbf{N} ≤ \textbf{300000}, \textbf{0} ≤ \textbf{K} ≤ \textbf{300000}). Наступні \textbf{K} рядків містять запити, по одному у рядку. Є три типи запитів:
\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