mstack

Time limit: 0.35s Memory limit: 64MB Input: mstack.in Output: mstack.out

Bulănel tocmai a descoperit o problemă interesantă de structuri de date și s-a gândit să o propună la concursul la care voi tocmai participați. Voi trebuie să implementați o structură de date pe care o vom numi MStack, care suportă toate operațiile pe care le suportă o stivă obișnuită (push, pop, top) plus operația middle (care returnează elementul aflat la jumătatea stivei). Deoarece această problemă ar fi fost prea ușoară, Bulănel adaugă urmatoarele restricții: MStack-ul vostru poate folosi ca structură internă de stocare doar 1313 stive obișnuite (numerotate de la 11 la 1313), iar numărul de operații asupra acestora trebuie să fie mai mic sau egal decât 5×5 \times numărul operațiilor asupra MStack-ului.

Operațiile care vor fi executate asupra MStack-ului sunt:

  • push: adaugă valoarea xx in vârful MStack-ului, unde xx este egal cu numărul de operații push efectuate pâna în momentul curent;
  • top: returnează valoarea din vârful MStack-ului;
  • middle: returnează valoarea care se află la jumătatea MStack-ului (daca sunt NN elemente în stiva, elementul din mijlocul stivei se gasește pe poziția N2+1\frac{N}{2}+1 numărând de la baza stivei);
  • pop: elimină elementul din vârful MStack-ului.

Pentru ca voi să nu trișati, va trebui ca operațiile pe care le efectuați asupra celor 1313 stive să le scrieți în fișierul de ieșire, iar operațiile permise sunt:

  • move a b: mută elementul din vârful stivei aa în vârful stivei bb;
  • pop a: aruncă elementul din vârful stivei aa;
  • push a: adaugă în vârful stivei aa valoarea xx, unde xx este egal cu numărul de operații push efectuate pâna in momentul curent;
  • top a: răspunde la operația top sau middle a MStack-ului, adică în vârful stivei aa se află elementul din vârful MStack-ului sau din mijlocul MStack-ului.

Cerință

Dându-se un set de operații care vor fi executate asupra MStack-ului, voi trebuie să execuțati o succesiune de operații asupra celor 1313 stive astfel încât:

  1. Pentru fiecare operație push sau pop din fișierul de intrare există o singură operatie push sau pop în fișierul de ieșire, păstrând ordinea din fișierul de intrare;
  2. Pentru fiecare operatie top si middle din fișierul de intrare există o singură operație top în fișierul de ieșire, păstrând ordinea din fișierul de intrare;
  3. La toate operațiile push, top și middle trebuie să se răspundă exact în ordinea din fișierul de intrare
  4. Operația move poate fi inserată între oricare două operații.

Date de intrare

Fisierul de intrare mstack.in conține pe prima linie numărul de operații NN, iar pe urmatoarele NN linii vor fi descrise cele NN operații, câte una pe linie.

Date de ieșire

Fisierul de iesire mstack.out conține operațiile care vor fi executate asupra celor 1313 stive, câte o operație pe linie, în ordinea în care vor fi executate.

Restricții și precizări

  • 1N1 000 0001 \leq N \leq 1 \ 000 \ 000
  • Pentru 30%30\% din teste 1N1 0001 \leq N \leq 1 \ 000
  • Se garantează că nu se va efectua nici o operație pop când MStack-ul este gol
  • Atenție! Pentru a primi punctajul pe un test, numărul de operații din fișierul de ieșire trebuie sa fie mai mic sau egal cu 5×5 \times numarul de operații din fișierul de intrare.

Exemplu

mstack.in

6
push
push
push
middle
pop
top

mstack.out

push 1
push 2
push 3
top 2
pop 3
top 2

Explicație

Se inserează în MStack elementele 1,21, 2 si 33. Middle are ca rezultat valoarea 22, apoi se elimina 33, iar top-ul din urmă are ca rezultat tot valoarea 22.

Intern, se insereaza in stiva 11 elementul 11, in stiva 22 elementul 22 si in stiva 33 elementul 33. Pentru a obtine middle-ul apelam top-ul stivei 22. Pentru pop apelam pop-ul stivei 33, iar pentru ultimul top apelam top-ul stivei 22.

Log in or sign up to be able to send submissions!