Präfixsummen sind äußerst praktisch, wenn man in Arrays mit verschiedenen Teilbereichen arbeiten muss. Häufig kann man Programme erheblich beschleunigen, indem man statt jeder einzelnen Summenberechnung die bereits vorberechnete Präfixsumme eines Arrays verwendet.
Stellen Sie sich ein Problem vor, bei dem wir sehr viele Anfragen (vielleicht sogar Millionen) der Form beantworten müssen: „Welchen Wert hat die Summe der Elemente des Arrays a vom Anfang bis zu ?“ Eine naive Herangehensweise wäre, diese Summe a[0] + a[1] + a[2] + ... + a[] bei jeder Anfrage komplett neu zu berechnen.
könnten wir zwar für jede Anfrage eine Schleife verwenden, die a[0] + a[1] + a[2] + ... + a[] berechnet, aber dabei entstehen viele unnötige Wiederholungen:
Man sieht hier deutlich, dass wir Teile der Summe wiederholt berechnen. Vor der Berechnung von res2 kennen wir bereits das Ergebnis von a[0] + a[1] + a[2] + a[3], was genau res1 war. Auch vor der Berechnung von res4 haben wir schon das Ergebnis für a[0] + a[1] + a[2] + a[3] + a[4] + a[5]. All diese sich wiederholenden Rechenschritte lassen sich vermeiden, sodass wir die Anfragen sogar unmittelbar beantworten können, ohne für jede wieder alle Elemente aufzuaddieren.
Dazu legen wir ein neues Array p an, in dem die Präfixsummen von a gespeichert werden. Das bedeutet, jedes Element von p enthält die Summe aller Elemente von a bis zu dem jeweiligen Index. Anschließend genügt es, für eine Anfrage einfach nur ein Element aus diesem Präfix-Array abzufragen:
Man erkennt, dass hier bei jedem nächsten Element der bereits bekannte Wert der vorherigen Präfixsumme nur noch um ein weiteres Element aus a ergänzt wird. So vermeiden wir es, immer wieder dieselben Zahlen zu addieren:
Diese Präfixsummen können in einer einzigen Schleife in linearer Zeit berechnet werden. Anschließend lassen sich alle Anfragen sofort beantworten, denn p[i] enthält direkt den Wert für a[0] + a[1] + a[2] + ... + a[i]. Das bedeutet: Für jede Anfrage genügt der Zugriff auf p[].
Können Sie nun das Präfixsummen-Array berechnen?
Eingabe
Die erste Zeile der Eingabe enthält eine einzelne ganze Zahl n (1 ≤ n ≤ ). Die zweite Zeile enthält n durch Leerzeichen getrennte ganze Zahlen, die das Array a beschreiben .
Ausgabe
Das Programm soll das Präfixsummen-Array von a ausgeben.