10820. Розрізання графа


Відправити розв'язок

Бали: 100
Time limit: 1.0s
Memory limit: 500M

Authors:
Problem type
Allowed languages
C++, Java, Pascal, Python

Дано неорієнтований граф. Над ним у заданому порядку здійснюють операції наступних двох типів:

  • \(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

Коментарі

Ще немає коментарів.