Вступление
Знаете ли вы, что на школьном соревновании по программированию был разработан новый язык программирования? Мы называем его D++. Вообще-то, неважно, знаете вы об этом или нет, но для запуска программ, написанных на D++, нужна новая операционная система. Она должна быть достаточно мощной и сложной, быстро работать и иметь много возможностей. Но это все в будущем.
А теперь вы должны… нет. Нет, не придумать название для операционной системы. Вы должны написать первый модуль для новой ОС. И, конечно, это модуль управления памятью. Давайте обсудим, как он должен работать.
Задача
Наша операционная система должна выделять память по частям, которые мы будем называть «блоками». Блоки пронумерованы целыми числами от 1 до N. Когда операционной системе требуется больше памяти, она делает запрос выделения памяти. Для обработки этого запроса модуль управления памятью должен найти свободный блок памяти с наименьшим номером и занять его. Можно считать, что существует достаточно блоков для обработки всех запросов.
Определим значение понятия «свободный блок». При первом обращении к модулю управления памятью все блоки считаются свободными. Также занятый блок становится свободным, когда в течение T минут к нему не поступало ни одного запроса доступа.
Что значит «запрос доступа к занятому блоку»? Ответ прост: в любой момент можно сделать запрос к модулю управления памятью, чтобы получить доступ к определенному блоку. Для обработки этого запроса модуль управления памятью должен проверить, действительно ли запрошенный блок занят. Если да, то запрос считается успешным и блок остается занятым еще на T минут. В противном случае запрос будет отклонен.
Вы должны реализовать модуль управления памятью для значений N = 30 000 и T = 10 минут.
Исходные данные
Каждая строка содержит запрос выделения блока памяти или доступа к занятому блоку памяти. Запрос выделения блока памяти имеет форму:
где <Time>
— неотрицательное целое число, не превышающее 65 000 — время запроса в секундах.
Запрос доступа к занятому блоку памяти имеет форму:
где <Time>
удовлетворяет условиям, указанным выше для запроса выделения памяти, а <BlockNo>
— целое значение в диапазоне от 1 до N.
Запросы следуют в порядке неубывания времени. Общее количество запросов будет не более 80000.
Результат
Для каждой строки входных данных необходимо вывести строку с результатом обработки запроса. На запрос выделения памяти нужно вывести только номер выделенного блока. Как было сказано выше, можно считать, что каждый запрос выделения памяти может быть удовлетворен, то есть в каждый момент времени будет занято не более N блоков одновременно. На запрос доступа к занятому блоку памяти необходимо вывести:
- '+', если запрос успешен (т.е. блок действительно занят);
- '-', если запрос отклонен (т.е. блок с заданным номером свободен, из-за чего доступ к нему невозможен).
Запросы нужно обрабатывать в том порядке, в котором они перечислены во входных данных.
Пример
исходные данные | результат |
---|
1 +
1 +
1 +
2 . 2
2 . 3
3 . 30000
601 . 1
601 . 2
602 . 3
602 +
602 +
1202 . 2
| 1
2
3
+
+
-
-
+
-
1
3
-
|
Автор задачи: Александр Клепинин
Источник задачи: Пятый командный чемпионат УрГУ по программированию (Октябрь 2000 г.)