Колекція set з пошуком найближчих
Перегляд у форматі PDFПопередження.
Ця задача може досить легко розв'язуватися одними мовами програмування, і значно важче – іншими. Автору задачі твердо відомо, що її легко розв'язати мовою C++ з використанням STL-контейнера set чи мовою Java з використанням колекції TreeSet. Наскільки відомо автору задачі, її не можна легко розв'язати ні мовою Python, ні мовою C#, бо відповідні типи чи колекції (Python set, C# HashSet, C# SortedSet, ...) тупо не містять потрібних для цієї задачі методів, які є в C++ STL std::set та Java TreeSet. Звісно, ніщо не заважає написати повністю свій аналог цих класів своєю мовою програмування, але це істотно складніше, чим використати готові методи готового бібліотечного типу. Чи є інші, крім перелічених, мови програмування, де цю задачу все-таки можна розв'язати легко, автор задачі не знає.
Кінець попередження.
Напишіть програму, яка виконуватиме послідовність запитів виду ADD num, PRESENT num та COUNT (без параметра).
Виконання кожного запиту виду
ADDnum має додавати елемент num у множину (якщо такий елемент вже є, додавання ще однієї копії не змінює множину), на екран при цьому нічого не виводиться.При виконанні кожного запиту виду
PRESENTnum значення множини не змінюється, а на екран повинно видаватися:- якщо число num наявне у множині (як елемент) – повідомлення
YES(великими літерами, в окремому рядку); - якщо ж такого елемента у множині немає, то в окремому рядку має бути виведено спочатку слово
NO(великими літерами), кома і один пробіл, а потім:- або слово
EMPTY(великими літерами), яке позначає, що множина порожня, - або нерівність, яка показує найближчі елементи, що знаходяться у множині; якщо множина містить і менший, і більший елементи, нерівність має бути подвійною, а якщо елемент із поточного запиту менше мінімального або більше максимального – одинарною.
- або слово
- якщо число num наявне у множині (як елемент) – повідомлення
При виконанні кожного запиту виду
COUNTмає видаватися на екран в окремому рядку кількість різних елементів у множині; значення множини при цьому не змінюється.
Вхідні дані (текстовий файл!)
Вхідні дані задані в текстовому файлі input.txt.
(Якщо нема досвіду роботи з файлами на сайтах з автоматичною перевіркою задач, спробуйте спочатку розв'язати задачу «A plus B — FILE(!) I/O».)
У першому рядку задано кількість запитів N (~1 < N < 500000~), далі йдуть N рядків, кожен з яких містить по одному запиту згідно з описаним форматом.
Значення чисел є цілими й належать діапазону знакового 32-бітового цілого типу.
Результати (текстовий файл!)
Результати слід вивести в текстовий файл output.txt.
Виводьте окремими рядками результати запитів PRESENT та COUNT; на запити ADD нічого не виводьте.
Зверніть увагу, що у випадку виведення символів < довкола них не можна ставити пробіли.
Приклади
Вхід
12
COUNT
PRESENT 3
ADD 2
ADD 5
PRESENT 3
PRESENT 1
PRESENT 17
COUNT
ADD 3
ADD 5
PRESENT 3
COUNT
Результат
0
NO, EMPTY
NO, 2<3<5
NO, 1<2
NO, 5<17
2
YES
3
Попередження.
Ця задача може досить легко розв'язуватися одними мовами програмування, і значно важче – іншими. Автору задачі твердо відомо, що її легко розв'язати мовою C++ з використанням STL-контейнера set чи мовою Java з використанням колекції TreeSet. Наскільки відомо автору задачі, її не можна легко розв'язати ні мовою Python, ні мовою C#, бо відповідні типи чи колекції (Python set, C# HashSet, C# SortedSet, ...) тупо не містять потрібних для цієї задачі методів, які є в C++ STL std::set та Java TreeSet. Звісно, ніщо не заважає написати повністю свій аналог цих класів своєю мовою програмування, але це істотно складніше, чим використати готові методи готового бібліотечного типу. Чи є інші, крім перелічених, мови програмування, де цю задачу все-таки можна розв'язати легко, автор задачі не знає.
Коментарі