1933 - Sume2

From Bitnami MediaWiki

Cerința[edit | edit source]

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[edit | edit source]

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[edit | edit source]

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[edit | edit source]

  • 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[edit | edit source]

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

Explicație[edit | edit source]

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[edit | edit source]

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

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line="1">

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

</syntaxhighlight>