Andrei este managerul unei librării care dorește să mențină o evidență exactă a prețurilor cărților din inventar. Emanuel, administratorul librăriei, implementează planuri de marketing care implică modificări repetate ale prețurilor (operații de modificare de preț), iar deciziile sale se pot schimba ulterior. Pentru a maximiza profitul obținut în funcție de cerere, în fiecare zi, Emanuel efectuează o serie de operații (modificări, anulări și refaceri), iar la sfârșitul fiecărei zile, Andrei trebuie să vadă starea finală a prețurilor din librărie.
Date de intrare
Fișierul librarie.in
conține:
- Linia : Un număr natural , numărul de cărți din librărie (numerotate de la la ).
- Linia : numere naturale, prețurile inițiale ale cărților.
- Linia : Un număr natural , numărul de zile.
- Pentru fiecare din cele zile:
- O linie cu un număr natural , numărul de operații din ziua respectivă.
- Următoarele linii, fiecare descriind o operație.
Tipuri de operații:
- Modificare preț: op index1 index2 număr
op este fie+
(adaugă număr la prețurile cărților de la index1 la index2 inclusiv), fie-
(scade număr din prețurile cărților de la index1 la index2 inclusiv). - Undo: — anulează ultima operație de modificare neanulată (dacă există).
- Redo: — reface ultima operație anulată care nu a fost refăcută (dacă există).
Date de ieșire
Fișierul librarie.out
va conține linii. Fiecare linie va conține, starea finală a prețurilor cărților la sfârșitul zilei respective, separate prin spații.
Restricții și precizări
- prețurile inițiale
- Pentru fiecare zi,
- număr
- index1 index2
- Este garantat că toate operațiile vor fi valide.
- Prețurile pot deveni negative în urma operațiilor.
- Starea se acumulează de la o zi la alta: ziua începe cu prețurile rezultate la finalul zilei , iar istoricul operațiilor (pentru undo/redo) se menține între zile.
- În cazul în care se efectuează o nouă operație de modificare după una sau mai multe comenzi , istoricul operațiilor se păstrează, permițând astfel ca operațiile anulate să poată fi refăcute ulterior prin comanda .
# | Puncte | Restricții |
---|---|---|
1 | 16 | numărul de operații de tipul undo/redo este |
2 | 15 | |
3 | 27 | , pentru fiecare operație de modificare de preț |
4 | 42 | Fără restricții suplimentare |
Exemplul 1
librarie.in
5
10 20 30 40 50
2
3
+ 1 3 5
- 2 5 10
+ 4 5 2
3
u
u
u
librarie.out
15 15 25 32 42
10 20 30 40 50
Explicație
Ziua :
Inițial: .
- : se adaugă la pozițiile , rezultând .
- : se scade din pozițiile , rezultând .
- : se adaugă la pozițiile , rezultând .
La finalul zilei , se obține starea: .
Ziua :
Inițial: [15, 15, 25, 32, 42].
Operațiile sunt:
- : anulează ultima operație , rezultând .
- : anulează următoarea operație (care a fost ), rezultând .
- : anulează următoarea operație (care a fost ), rezultând .
La finalul zilei , se obține starea: .
Exemplul 2
librarie.in
10
4 8 5 9 1 2 3 7 11 12
2
4
+ 2 5 2
- 1 3 2
+ 1 7 3
+ 1 7 3
5
u
r
+ 3 8 4
- 4 10 1
r
librarie.out
8 14 11 17 9 8 9 7 11 12
8 14 15 20 12 11 12 10 10 11
Explicație
Ziua :
Inițial: .
- : se adaugă la pozițiile , rezultând .
- : se scade din pozițiile , rezultând .
- : se adaugă la pozițiile , rezultând .
- : se adaugă încă la pozițiile , rezultând .
La finalul zilei , starea este: .
Ziua :
Inițial: .
Operațiile sunt:
- : anulează ultima operație , rezultând .
- : refă operația anulată, revenind la .
- : se adaugă la pozițiile , rezultând .
- : se scade din pozițiile , rezultând .
- : nu există nicio operație anulată la acest moment (comanda nu are efect), deci starea rămâne .
La finalul zilei , starea este: .