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
Dându-se șirul de elemente și operațiile, începand cu cele de tipul 1, aplicați operațiile pe șir.
Date de intrare
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
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
- 1 ≤ N ≤ 100.000
- -1.000.000.000 ≤ a[i], val ≤ 1.000.000.000
- 1 ≤ st ≤ dr ≤ N
- 1 ≤ poz ≤ N
Exemplul 1
- 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
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
- 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
# 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")