Problems
Соединение и разъединение
Соединение и разъединение
Вы когда-нибудь слышали про обход в глубину? Например, используя этот алгоритм, вы можете проверить, является ли граф связным, за время \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{?}", выведите количество компонент связности в момент запроса.
Input example #1
5 11 ? + 1 2 + 2 3 + 3 4 + 4 5 + 5 1 ? - 2 3 ? - 4 5 ?
Output example #1
5 1 1 2