Замовлення Айсберг#7569

Замовлення Айсберг

1 секунда
128 мегабайтів
Складна

Ви працюєте на біржі Метагонія. Нещодавно торговці в Метагонії дізналися про заявки айсберга, що використовуються на Лондонській фондовій біржі, і попросили вашого роботодавця додати таку функціональність. Фондова біржа — це фінансовий інститут, який отримує замовлення і генерує угоди.

Заявка айсберга — це п'ятірка цілих чисел (ID, T, P, V, TV). Кожна заявка має унікальний ідентифікатор , тип (або BUY = 1, або SELL = 2), ціну , загальний залишковий обсяг і видимий обсяг . Для кожної заявки також відстежується її поточний обсяг і пріоритет . Існує також глобальний лічильник пріоритетів обміну . Заявка додається до набору заявок біржі.

Торги, що генеруються на біржі, представляють собою чотири цілі числа (BUY\text{-}ID, SELL\text{-}ID, P, V). Кожна угода містить BUY\text{-}ID і SELL\text{-}ID — ідентифікатори відповідних BUY і SELL замовлень, торгову ціну і обсяг торгів .

Коли заявка виставляється на торги, вона зіставляється із заявками, що вже є в реєстрі. Це відбувається наступним чином. Нехай отримано замовлення , у якого T_a = SELL. Серед усіх заявок, виставлених на торги, ми шукаємо заявку , таку що T_b = BUY і P_b \geq P_a. Ми вибираємо таку заявку , яка має найбільшу ціну, а якщо таких кілька — то з найменшим пріоритетом. Якщо така заявка існує, то генерує торгову угоду , у якої BUY\text{-}ID_t = ID_b і SELL\text{-}ID_t = ID_a за ціною P_t = P_b обсягом V_t = \min(V_a,\,CV_b). Значення V_a, V_b і CV_b зменшуються на обсяг угоди. Якщо після цього V_b = 0, то заявка видаляється з реєстру заявок. Якщо CV_b = 0 (але V_b > 0), то встановлюємо поточний обсяг заявки рівним CV_b = \min(V_b,\,TV_b), встановлюємо PR_b = GP, і збільшуємо . Продовжуємо операції вибору і генерування торгів, поки не стане або V_a = 0, або не залишиться таких заявок в реєстрі, що задовольняють умові можливості торгів. У цьому випадку ми додаємо замовлення до книги замовлень з CV_a = \min(V_a,\,TV_a) і PR_a = GP, а потім збільшуємо . Коли процес зіставлення замовлення завершено з кількома угодами між однією парою замовлень і (і їх може бути багато!), вони всі об'єднуються в одну угоду з обсягом, рівним сумі обсягів окремих угод.

Якщо T_a = BUY, ми шукаємо замовлення з T_b = SELL і P_b \leq P_a і вибираємо таке замовлення з найменшою ціною і найменшим пріоритетом серед них. Решта процесу зіставлення описана вище, з угодами, що мають BUY\text{-}ID_t = ID_a, SELL\text{-}ID_t = ID_b, P_t = P_b, і V_t = \min(V_a,\,CV_b).

Спочатку книга замовлень порожня. Вам надано кілька замовлень, які надходять на біржу одне за одним. Вам потрібно надрукувати згенеровані угоди і стан книги замовлень після обробки всіх замовлень.

Підказка: Пріоритет і введені в умові задачі лише для формального опису алгоритму. Реальна реалізація не повинна відстежувати пріоритет. Зазвичай біржа просто веде список замовлень кожного типу за кожною ціною в своїй книзі замовлень, упорядкований за пріоритетом.

Вхідні дані

Перший рядок містить кількість заявок (1 \leq n \leq 50000). Кожен з наступних рядків представляє заявку. Кожна заявка задається п'ятіркою ID\,T\,P\,V\,TV, де 1 \leq ID \leq 1000000, T = 1 для BUY і T = 2 для SELL, 1 \leq P \leq 100000 і 1 \leq TV \leq V \leq 10^9.

Вихідні дані

Для кожного замовлення надрукуйте всі угоди, згенеровані обробкою цього замовлення, у порядку зростання пар (BUY\text{-}ID, SELL\text{-}ID), кожну угоду на окремому рядку. Кожна угода повинна бути надрукована як пробілом розділена четвірка цілих чисел BUY\text{-}ID\,SELL\text{-}ID\,P\,V. Гарантовано, що загальна кількість угод не перевищить . Надрукуйте порожній рядок після всіх угод, за яким слідує книга замовлень. Кожне замовлення, яке все ще є в книзі, повинно бути надруковано як пробілом розділена шістка ID\,T\,P\,V\,TV\,CV, відсортована спочатку за , а потім за .

Приклади

Приклад 1

Loading
Loading

Примітка

У прикладі перші чотири заявки мають T = BUY. Припускаючи, що на початку торгів дорівнює , після отримання цих заявок реєстр виглядає наступним чином, упорядкований за правилами відповідності з умови задачі для T_b = BUY (спочатку за спаданням ціни, потім за зростанням пріоритету):

П'ята заявка (ID_a = 4321) має T_a = SELL, P_a = 99 і V_a = 125 і може бути зіставлена з усіма чотирма заявками, наведеними в таблиці вище. Спочатку вона зіставляється двічі із заявкою з найвищою ціною на загальний обсяг угоди , видаляє її з книги замовлень, збільшує до в процесі, і зменшує V_a до . Потім є три інші заявки за ціною . Один прохід зіставлення через них генерує три угоди на загальний обсяг (обсяг із заявкою , обсяг із заявкою , видаляє її з книги, обсяг із заявкою ), збільшує до , і зменшує V_a до . Залишилися заявки в книзі показані нижче:

Останнє зіставлення із заявкою генерує угоду з обсягом (на загальний обсяг для зіставлень із заявкою ) і заявка завершена (V_a = 0). Чотири відповідні загальні угоди для заявки надруковані у вихідних даних прикладу. Залишилася книга замовлень:

Шоста заявка BUY (з ID = 5678) додається до книги замовлень ( стає ):

Остання, сьома заявка (з ID = 8765), може бути зіставлена лише із заявкою через цінову умову, генерує угоду з обсягом , заявка видаляється з книги замовлень, тоді як заявка додається. Тепер книга замовлень має як BUY, так і SELL заявки: