1835 - twoop

De la Universitas 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

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