3695 - iziStack

From Bitnami MediaWiki

Enunt[edit | edit source]

Se dă o stivă vidă. Elementele stivei sunt numerotate incepand cu 1 de la bază înspre vârf. Avem de procesat T comenzi de tipurile:

  • 0 x – elementul x se va adăuga în vârful stivei
  • 1 x y add – tuturor elementelor din intervalul x y le va fi adăugată valoarea add
  • 2 – eliminarea elementului din vârf

Cerinţa[edit | edit source]

Afisați dupa fiecare operație elementul din vârful stivei. Se garantează: 1. că nu se va efectua operația de tip 2 dacă nu există cel puțin două elemente în stivă; 2. că prima operatie va fi de tipul 0

Date de intrare[edit | edit source]

Fișierul de intrare izi.in conține pe prima linie un număr natural T, iar pe următoarele T linii operațiile efectuate asupra stivei.

Date de ieșire[edit | edit source]

Fișierul de ieșire izi.out va conține T linii, reprezentând elementele din vârful stivei dupa fiecare operație.

Restricţii şi precizări[edit | edit source]

  • 1 ≤ T ≤ 1.000.000
  • -1000 ≤ add ≤ 1000
  • Pentru operațiile de tip 1, -1000 ≤ x ≤ 1000, iar pentru operatiile de tip 2 numărul elementelor aflate în stivă este mai mare ca y
  • Pentru 36 puncte: 1 ≤ T ≤ 1000
  • Pentru alte 33 puncte: Toate operatiile de tip 2 se vor afla la finalul fișierului de intrare

Exemplu[edit | edit source]

izi.in
7
0 1
1 1 1 2
0 2
1 1 2 3
2
0 4
2
izi.out
1
3
2
5
6
4
6


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> class Stack:

   def __init__(self):
       self.stack = []
   def push(self, x):
       self.stack.append(x)
   def pop(self):
       if self.is_empty():
           return None
       return self.stack.pop()
   def top(self):
       if self.is_empty():
           return None
       return self.stack[-1]
   def is_empty(self):
       return len(self.stack) == 0

def process_operations(T, operations):

   stack = Stack()
   for op in operations:
       if op[0] == 0:
           stack.push(op[1])
       elif op[0] == 1:
           x, y, add = op[1], op[2], op[3]
           for i in range(x - 1, y):
               stack.stack[i] += add
       elif op[0] == 2:
           stack.pop()
       if not stack.is_empty():
           print(stack.top())

def main():

   T = int(input())
   operations = []
   for _ in range(T):
       operation = list(map(int, input().split()))
       operations.append(operation)
   process_operations(T, operations)

if __name__ == "__main__":

   main()

</syntaxhighlight>