1933 - Sume2

De la Universitas MediaWiki

Cerința

Fie N un numar natural și un șir de N numere naturale V[1], V[2], …, V[N]. Pentru M întrebări de forma (i,j), să se calculeze suma termenilor V[i], V[i + 1], …, V[j].

Date de intrare

Pe prima linie a fișierului sume2in.txt se găsește un număr natural N. Pe urmatoarea linie sunt N numere naturale, reprezentând valorile șirului V. Pe a treia linie se găsește un număr natural M reprezentând numărul de întrebări, iar pe următoarele M linii câte o pereche de numere (i,j), reprezentând o întrebare pentru care se cere să se calculeze suma V[i] + V[i + 1] + ... + V[j].

Date de ieșire

Pe prima linie din fişierul sume2out.txt se găseşte răspunsul la prima întrebare din fişierul de intrare, pe a doua linie se găseşte răspunsul la cea de-a doua întrebare, și așa mai departe.

Restricții și precizări

  • 1 ≤ N ≤ 100.000
  • 1 ≤ M ≤ 500.000
  • 0 ≤ V[i] ≤ 1.000.000.000

Pentru 30% dintre teste N, M ≤ 1.000

Exemplul 1

sume2in.txt
4
1 2 3 4
2
1 3
2 4
sume2.out
Datele introduse corespund restricțiilor impuse.
6
9

Explicație

uma elementelor de pe pozițiile de la 1 la 3 este 6. Suma elementelor de pe pozițiile de la 2 la 4 este 9.

Exemplul 2

sume2in.txt
6
1 2 3 4 5 1000000001
2
1 3
2 4
sume2.out
Datele introduse nu corespund restricțiilor impuse.

Rezolvare

# 1933 - Sume2
def validare(numarde_elemente, numarde_intrebari, sirul, intrebarii):        # functia de validare a datelor de intrare
    if not (1 <= numarde_elemente <= 100000) or not (1 <= numarde_intrebari <= 500000):
        raise ValueError

    if len(sirul) != numarde_elemente or any(not (0 <= element <= 1000000000) for element in sirul):
        raise ValueError

    if any(not (1 <= i <= j <= numarde_elemente) for i, j in intrebarii):
        raise ValueError

    fisier_iesire.write("Datele de intrare corespund restrictiilor impuse\n")


def calculeaza_sume(sirul, intrebarii):                     # functia de rezolvare
    for i, j in intrebarii:
        suma = sum(sirul[k - 1] for k in range(i, j + 1))
        fisier_iesire.write(f"{suma}\n")


if __name__ == '__main__':
    fisier_intrare = open("sume2in.txt", "r")         # declararea fisierelor
    fisier_iesire = open("sume2out.txt", "w")       # fisierul out trebuie declarat cu optiunea "w" (write)

    try:
        numar_elemente = int(fisier_intrare.readline())
        sir = list(map(int, fisier_intrare.readline().split()))
        numar_intrebari = int(fisier_intrare.readline())
        intrebari = [list(map(int, fisier_intrare.readline().split())) for _ in range(numar_intrebari)]

        validare(numar_elemente, numar_intrebari, sir, intrebari)                 # apelul functiei de validare
        calculeaza_sume(sir, intrebari)               # apelul functiei de rezolvare

    except ValueError:
        fisier_iesire.write("Datele de intrare nu corespund restrictiilor impuse")