1835 - twoop
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">
- 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>