1835 - twoop

From Bitnami MediaWiki

Se dă un șir de N elemente, numere întregi. Pe acest șir se aplică operații de două tipuri : Tip 1: st dr val – elementele de pe pozițiile din intervalul [st, dr] cresc cu valoarea val Tip 2: poz – să se afișeze valoarea elementului de pe poziția poz . Toate operațiile de tipul 2 se aplică numai după ce s-au aplicat toate operațiile de tipul 1.

Cerința[edit | edit source]

Dându-se șirul de elemente și operațiile, începand cu cele de tipul 1, aplicați operațiile pe șir.

Date de intrare[edit | edit source]

Fișierul de intrare twoopin.txt conține pe prima linie numărul de elemente, N , numărul de operații de tip 1, nrOp1 , și numărul de operații de tip 2, nrOp2. Pe următoarea linie se află cele N elemente separate printr-un spațiu. Pe următoarele nrOp1 linii se află câte o operație de tip 1 sub forma: st dr val. Pe următoarele nrOp2 linii se află câte o operație de tip 2 sub forma: poz.

Date de ieșire[edit | edit source]

Fișierul de ieșire twoopout.txt va conține pe primele nrOp2 linii câte un element, rezultatul unei operații de tip 2.

Restricții și precizări[edit | edit source]

  • 1 ≤ N ≤ 100.000
  • -1.000.000.000 ≤ a[i], val ≤ 1.000.000.000
  • 1 ≤ st ≤ dr ≤ N
  • 1 ≤ poz ≤ N

Exemplul 1[edit | edit source]

twoopin.txt
4 4 2
5 0 -1 2
1 2 -2
2 3 10
1 4 2
2 3 3
2
3
twoopout.txt
Datele introduse corespund restricțiilor impuse.
13
14

Explicație[edit | edit source]

5 0 -1 2 – șir initial 3 -2 -1 2 – după operația 1 3 8 9 2 – după operația 2 5 10 11 4 – după operația 3 5 13 14 4 – după operația 4

Exemplul 2[edit | edit source]

twoopin.txt
5 2 2
5 0 -1 2 1500000000
1 2 -2
2 3 10
2
3
twoopout.txt
Datele introduse nu corespund restricțiilor impuse.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line="1">

  1. 1835 - twoop

def validare(numarde_elemente, numar_operatii, numar_operatiiv2, sirul, operatiiv1, operatiiv2):

   if numarde_elemente > 100000 or numarde_elemente < 1 or numar_operatii < 1 or numar_operatiiv2 < 1:
       raise ValueError
   for element in sirul:
       if element > 1000000000 or element < -1000000000:
           raise ValueError
   for operatie in operatiiv1:
       if operatie[0] < 1 or operatie[1] > numarde_elemente or operatie[2] > 1000000000 or operatie[2] < -1000000000:
           raise ValueError
   for pozitie in operatiiv2:
       if pozitie < 1 or pozitie > numarde_elemente:
           raise ValueError
   fisier_iesire.write("Datele de intrare corespund restrictiilor impuse\n")


def aplica_operatii(sirul, operatii, operatiiv2):

   for operatie in operatii:
       for i in range(operatie[0]-1, operatie[1]):
           sirul[i] += operatie[2]
   for pozitie in operatiiv2:
       fisier_iesire.write(str(sirul[pozitie - 1]) + '\n')


if __name__ == '__main__':

   fisier_intrare = open("twoopin.txt", "r")
   fisier_iesire = open("twoopout.txt", "w")
   try:
       numar_elemente, numar_operatii1, numar_operatii2 = map(int, fisier_intrare.readline().split())
       sir = list(map(int, fisier_intrare.readline().split()))
       operatii1 = [list(map(int, fisier_intrare.readline().split())) for _ in range(numar_operatii1)]
       operatii2 = [int(fisier_intrare.readline()) for _ in range(numar_operatii2)]
       validare(numar_elemente, numar_operatii1, numar_operatii2, sir, operatii1, operatii2)
       aplica_operatii(sir, operatii1, operatii2)
   except ValueError:
       fisier_iesire.write("Datele de intrare nu corespund restrictiilor impuse")
   except IndexError:
       fisier_iesire.write("Datele de intrare nu corespund restrictiilor impuse")

</syntaxhighlight>