eolymp
bolt
Try our new interface for solving problems
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{?}", выведите количество компонент связности в момент запроса.
Time limit 2 seconds
Memory limit 256 MiB
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