Задача №950. База данных
Ценные бумаги на фондовом рынке характеризуются множеством параметров. У них есть цена и ликвидность, также оценивать динамичность изменения цены, среднюю прибыльность, потенциал роста прибыльности и др. показатели. Аналитики трейдовой компании "WebMarket" ввели специальный показатель надежности ценной бумаги и научились эффективно его оценивать. Большое значение этого показателя соответствует малому риску покупки ценной бумаги. Но с ростом надежности обычно падает среднее оцениваемое значение прибыльности.
Для своих клиентов, играющих на рынке ценных бумаг, компания "WebMarket" решила открыть значения этого показателя и более того, автоматизировать покупку ценных бумаг с заданным порядковым номером по значению надежности. Аналитики проанализировали идею, и решили, что наличие такого функционала будет способствовать привлечению новых клиентов на рынок "WebMarket", повышению объемов сделок, а значит, и повышению прибылей "WebMarket". Важно также отметить, что торговля на базе этого показателя может позитивно сказаться на российском фондовом рынке и cделать его более здоровым. Алгоритмы оценки надежности уже написаны, средства выделены, необходимая реклама проведена. Осталось только написать сам код.
Ценные бумаги в базе данных имеют три атрибута:
- code — непустая строка латинских символов и цифр длины 30 или меньше
- id — целочисленный идентификатор (начиная с 0)
- reliability — целое число из диапазона \([-2^{31}, 2^{31})\).
Каждой новой ЦБ выдается следующий по порядку id и значение её надёжности устанавливается в 0. Если ценная бумага отзывается с рынка, ее id для новых бумаг не используется.
База данных получает запросы, которые позволяют вводить новые ЦБ на рынок, получать текущую информацию о ЦБ, отзывать ЦБ с рынка, менять значение надежности у ЦБ и находить ЦБ, которая стоит на n-м месте, если упорядочить ЦБ по убыванию надежности, а при одинаковых значениях по возрастанию идентификатора.
При добавлении ЦБ с кодом, который раньше встречался, но соответствующая ЦБ была отозвана с рынка, ей назначается новый идентификатор.
-
ISSUE code: добавить новую ЦБ code в базу данных, или вывести информацию о ЦБ, если она уже есть в базе
- если ЦБ code существует, то вывести EXISTS id reliability
- если ЦБ code не существует, то вывести CREATED id 0
-
DELETE code: удалить ЦБ code из базы
- если ЦБ code существует, то вывести OK id reliability
- если ЦБ code не существует, то вывести BAD REQUEST
-
RELIABILITY code reliability: увеличить количество очков ЦБ, гарантируется, что значение останется в диапазоне \([-2^{31}, 2^{31})\).
- если ЦБ code существует, то вывести OK id new_reliability
- если ЦБ code не существует, то вывести BAD REQUEST
-
FIND n: найти n-ю ЦБ (начиная с 0)
- если база не пуста, найти ЦБ, которая имела бы порядковый номер n (нумерация начинается с 0), если все ЦБ упорядочить сначала по убыванию баллов, а группы ЦБ с одинаковыми баллами упорядочить по времени их добавления (то есть по возрастанию id); а если n больше, чем количество ЦБ в базе, то найти последнюю ЦБ в этом порядке; для обоих случаев вывести OK code id reliability
- если база пуста, то вывести EMPTY
Таким образом, на каждый запрос на входе нужно вывести одну строку с результатом.
17 ISSUE aaa FIND 10 ISSUE bbb ISSUE ccc RELIABILITY aaa 10 RELIABILITY bbb 30 RELIABILITY ccc 20 RELIABILITY xxx 20 FIND 1 FIND 2 FIND 0 ISSUE eee ISSUE fff FIND 3 FIND 111 DELETE bbb FIND 0
CREATED 0 0 OK aaa 0 0 CREATED 1 0 CREATED 2 0 OK 0 10 OK 1 30 OK 2 20 BAD REQUEST OK ccc 2 20 OK aaa 0 10 OK bbb 1 30 CREATED 3 0 CREATED 4 0 OK eee 3 0 OK fff 4 0 OK 1 30 OK ccc 2 20