Şimal-Şərq Resurslar və Əmtəələr Birjası (NEERC) üçün əməliyyatların avtomatlaşdırılması üzrə böyük bir layihədə iştirak edirsiniz. Bu birjada müxtəlif resurslar və əmtəələr açıq hərrac vasitəsilə ticarət olunur. Hər bir resurs və ya əmtəə müstəqil şəkildə ticarət olunur və sizin vəzifəniz bu birja üçün əsas mühərriki — sifariş kitabını yazmaqdır. Hər ticarət olunan resurs və ya əmtəə üçün ayrı bir sifariş kitabı nümunəsi var və düzgün sifarişlərin sifariş kitablarına daxil edilməsi sizin probleminiz deyil. Yazacağınız sifariş kitabı nümunəsi birja sisteminin qalan hissəsindən uyğun sifarişləri qəbul edəcək.
Sifariş kitabı mesaj axını alır. Mesajlar sifarişlər və əvvəlki sifarişlərin ləğvi üçün sorğulardan ibarətdir. Ləğv edilməmiş sifarişlər aktiv adlanır. Alış və satış sifarişləri mövcuddur. Hər bir alış və ya satış sifarişi müsbət ölçüyə və müsbət qiymətə malikdir. Sifariş kitabı aktiv sifarişlərin siyahısını saxlayır və təkliflər və ticarətlər yaradır. Ən yüksək qiymətə alış sifarişi ən yaxşı alış sifarişidir və onun qiyməti təklif qiyməti adlanır. Ən aşağı qiymətə satış sifarişi ən yaxşı satış sifarişidir və onun qiyməti sorğu qiyməti adlanır. Sorğu qiyməti həmişə təklif qiymətindən aşağıdır, yəni alıcılar satıcıların almaq istədiklərindən daha az ödəmək istəyirlər.
Sifariş kitabından cari təklif cari təklif ölçüsü, təklif qiyməti, sorğu ölçüsü və sorğu qiymətini ehtiva edir. Burada təklif və sorğu ölçüləri müvafiq olaraq cari təklif qiyməti və cari sorğu qiyməti ilə bütün aktiv sifarişlərin ölçülərinin cəmləridir.
Ticarət alıcı və satıcı arasında əməliyyat haqqında məlumatları qeyd edir. Hər bir ticarət ölçü və qiymətə malikdir.
Əgər alış sifarişi sifariş kitabına cari sorğu qiymətinə bərabər və ya ondan yüksək qiymətlə daxil olarsa, müvafiq sifarişlər uyğunlaşdırılır və ticarət baş verir — alıcı və satıcı qiymət üzərində razılığa gəlirlər. Əksinə, əgər satış sifarişi sifariş kitabına cari təklif qiymətinə bərabər və ya ondan aşağı qiymətlə daxil olarsa, ticarət də baş verir. Sifarişlərin uyğunlaşdırılması məqsədilə sifariş kitabı eyni qiymətlə sifarişlər üçün FIFO növbəsi kimi işləyir (ətraflı məlumat üçün oxuyun).
Əgər alış sifarişi sifariş kitabına cari sorğu qiymətinə bərabər və ya ondan yüksək qiymətlə daxil olarsa, o, dərhal sifariş kitabına daxil edilmir. Əvvəlcə bir sıra ticarətlər yaradılır, bu da gələn sifarişin ölçüsünü azalda bilər. Ticarət gələn alış sifarişi və ən yaxşı satış sifarişi arasında yaradılır. Əgər bir neçə ən yaxşı sifariş varsa (sorğu qiymətində), onda sifariş kitabına ilk daxil olan sifariş seçilir. Ticarət cari sorğu qiymətində yaradılır və ticarətin ölçüsü uyğunlaşan iki sifarişin ölçülərinin kiçiyinə bərabərdir. Hər iki uyğunlaşan sifarişin ölçüləri ticarətin ölçüsü qədər azalır. Əgər bu, satış sifarişinin ölçüsünü sıfıra endirirsə, o zaman o, qeyri-aktiv olur və sifariş kitabından çıxarılır. Əgər gələn alış sifarişinin ölçüsü sıfıra bərabər olarsa, proses başa çatır — gələn sifariş qeyri-aktiv olur. Əgər gələn alış sifarişinin ölçüsü hələ də müsbətdirsə və uyğunlaşdırılacaq başqa satış sifarişi varsa, proses yeni sorğu qiymətində daha çox ticarət yaratmağa davam edir (satış sifarişləri ticarət edildikcə və qeyri-aktiv olduqca sorğu qiyməti arta bilər). Əgər uyğunlaşdırılacaq satış sifarişi yoxdursa (cari sorğu qiyməti gələn alış sifarişinin qiymətindən böyük oldu), gələn alış sifarişi qalan ölçüsü ilə sifariş kitabına əlavə olunur.
Gələn satış sifarişi üçün hər şey oxşar şəkildə işləyir — o, sifariş kitabından alış sifarişləri ilə uyğunlaşdırılır və təklif qiymətində ticarətlər yaradılır.
Gələn ləğv sorğusu üzrə müvafiq sifariş sadəcə sifariş kitabından çıxarılır və qeyri-aktiv olur. Qeyd edək ki, ləğv sorğusu zamanı müvafiq sifarişin miqdarı artıq qismən azalmış və ya sifariş qeyri-aktiv ola bilər. Qeyri-aktiv sifarişin ləğvi üçün sorğular sifariş kitabında heç nəyi dəyişmir.
Hər bir gələn mesajda sifariş kitabı onun səbəb olduğu bütün ticarətləri və müvafiq mesajın işlənməsindən sonra cari təklifi (təklif ölçüsü, təklif qiyməti, sorğu ölçüsü, sorğu qiyməti) yaratmalıdır, hətta bu mesaj nəticəsində sifariş kitabında heç nə dəyişməsə belə. Beləliklə, sifariş kitabının yaratdığı təkliflərin sayı həmişə gələn mesajların sayına bərabərdir.
Girişin ilk sətri sifariş kitabının işləməli olduğu n (1 ≤ n ≤ 10000) gələn mesajların sayını ehtiva edən tək tam ədəddir. Növbəti n sətir mesajları ehtiva edir. Hər bir sətir mesaj növünü təsvir edən bir sözdən başlayır — BUY, SELL və ya CANCEL, ardınca boşluqdan sonra mesaj parametrləri gəlir.
BUY və SELL müvafiq olaraq alış və ya satış sifarişini göstərir və ardınca iki tam ədəd q və p (1 ≤ q ≤99999, 1 ≤ p ≤ 99999) — sifariş ölçüsü və qiyməti gəlir. CANCEL əvvəlki alış və ya satış sifarişini ləğv etmək üçün sorğunu göstərir. O, ardınca əvvəlki alış və ya satış sifarişi ilə bəzi mesajın nömrəsi olan tək tam ədəd i ilə gəlir (mesajlar 1 -dən n -ə qədər nömrələnir).
Gələn mesajların yaratdığı təkliflər və ticarətlər axınını çıxışa yazın. Hər bir ticarət üçün TRADE yazın, ardınca boşluqdan sonra ticarət ölçüsü və qiyməti. Hər bir təklif üçün QUOTE yazın, ardınca boşluqdan sonra təklif ölçüsü, təklif qiyməti, mənfi işarə ("-"), sorğu ölçüsü, sorğu qiyməti (hamısı boşluqlarla ayrılmış).
Aktiv alış və ya satış sifarişlərinin sifariş kitabında olmadığı xüsusi bir hal var (təklif və ya sorğu müəyyən edilməyib). Bu hal aşağıdakı kimi qəbul edilir. Əgər aktiv alış sifarişi yoxdursa, o zaman təklif ölçüsünün sıfır və təklif qiymətinin sıfır olduğu qəbul edilir. Əgər aktiv satış sifarişi yoxdursa, o zaman sorğu ölçüsünün sıfır və sorğu qiymətinin 99999 olduğu qəbul edilir. Qeyd edək ki, sıfır qanuni qiymət deyil, lakin 99999 qanuni qiymətdir. Təklif mesajlarının alıcısı faktiki 99999 sorğu qiymətini satış sifarişlərinin olmaması xüsusi halından sorğu ölçüsünə baxaraq ayırır.
Nümunəyə baxın.
Nümunə 1