10820. Розрізання графа
Дано неорієнтований граф. Над ним у заданому порядку здійснюють операції наступних двох типів:
- \(cut\) - розрізати граф, тобто видалити з нього ребро;
- \(ask\) - Перевірити, чи лежать дві вершини графа в одній компоненті зв'язності.
Відомо, що після виконання всіх операцій типу \(cut\) ребер у графі не залишилося.
Знайдіть результат виконання кожної з операцій типу \(ask\).
Формат вхідних даних
Перший рядок містить три цілих числа, розділені пробілами - кількість вершин графа \(𝑛\), кількість ребер \(𝑚\) і кількість операцій \(𝑘\) (\(1≤𝑛≤50000\) , \(0≤𝑚≤100000\) , \(𝑚≤𝑘≤150000\).
Наступні рядків задають ребра графа; \(𝑖\) -й з цих рядків містить два числа \(𝑢_𝑖\) і \(𝑣_𝑖\) (\(1≤𝑢_𝑖,𝑣_𝑖≤𝑛 \)), розділені пробілами - номери кінців \(𝑖\)-го ребра. Вершини нумеруються з одиниці; граф не містить петель та кратних ребер.
Далі йдуть \(k\) рядків, що описують операції. Операція типу \(cut\) задається рядком „\(cut\) \(u\) \(v\)“ (\(1≤𝑢,𝑣≤𝑛 \)), який означає, що з графа видаляють ребро між вершинами \(𝑢\) і \(𝑣\) . Операція типу \(ask\) задається рядком „\(ask\) \(u\) \(v\)“ (\(1≤𝑢,𝑣≤𝑛 \)), який означає, що необхідно дізнатися, чи лежать в даний момент вершини \(𝑢\) і \(𝑣\) в одній компоненті зв'язності.
Гарантується, що кожне ребро графа зустрінеться в операціях типу \(cut\) рівно один раз.
Формат вихідних даних
Для кожної операції \(ask\) виведіть на окремому рядку слово \(YES\), якщо дві вказані вершини лежать в одній компоненті зв'язності, та \(NO\) в іншому випадку.
Порядок відповідей повинен відповідати порядку операцій \(ask\) у вхідних даних.
Приклад вхідних даних
3 3 7
1 2
2 3
3 1
ask 3 3
cut 1 2
ask 1 2
cut 1 3
ask 2 1
cut 2 3
ask 3 1
Приклад вихідних даних
YES
YES
NO
NO
Коментарі