1835 - twoop

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

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")