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

З`єднання та роз`єднання

З`єднання та роз`єднання

Ви коли-небудь чули про обхід в глибину? Наприклад, використовуючи цей алгоритм, ви можете перевірити, чи є граф зв'язним, за час \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{?}", виведіть кількість компонент зв'язності у момент запиту.
Ліміт часу 2 секунди
Ліміт використання пам'яті 256 MiB
Вхідні дані #1
5 11
?
+ 1 2
+ 2 3
+ 3 4
+ 4 5
+ 5 1
?
- 2 3
?
- 4 5
?
Вихідні дані #1
5
1
1
2