Le somme prefisse sono estremamente utili quando si lavora con intervalli in un array. Spesso è possibile ottimizzare notevolmente i programmi utilizzando la somma prefissa di un array invece di calcolare la somma a ogni richiesta.
Immagina di dover rispondere a molte richieste (anche milioni) del tipo: “Qual è la somma degli elementi dell’array a dall’inizio fino a ?”. Un approccio ingenuo sarebbe calcolare ogni volta la somma a[0] + a[1] + a[2] + ... + a[]. Ad esempio, se abbiamo un array e delle query:
Noterai che la prima parte del calcolo è sempre la stessa. Prima di calcolare res2, conosciamo già il risultato di a[0] + a[1] + a[2] + a[3], che corrispondeva a res1. Prima di calcolare res4, sappiamo già quanto vale la somma a[0] + a[1] + a[2] + a[3] + a[4] + a[5]. È evidente che possiamo ottimizzare questi calcoli e rispondere alle richieste istantaneamente invece di lanciare un ciclo for per ogni domanda.
Per farlo, possiamo memorizzare un nuovo array p di somme prefisse, in cui gli elementi di p rappresentano la somma degli elementi dell’array a fino a quell’indice. In questo modo, la risposta a ogni richiesta sarà semplicemente accedere a un elemento dell’array delle somme prefisse:
Osserva lo schema: per calcolare l’elemento successivo nell’array p, riprendiamo tutto ciò che avevamo già sommato in quello precedente e aggiungiamo un altro elemento di a. In questo modo, sfruttiamo i calcoli precedenti evitando di sommare gli stessi numeri più volte:
Questo può essere calcolato con un singolo ciclo for in tempo lineare, anziché eseguire più cicli che ripetono gli stessi calcoli. Dopo aver creato l’array delle somme prefisse p, potremo rispondere a tutte le nostre richieste all’istante, perché p[i] contiene la somma a[0] + a[1] + a[2] + ... + a[i]. Quindi, per ogni query , la risposta sarà semplicemente p[].
Puoi calcolare ora l’array delle somme prefisse?
Input
La prima riga dell’input contiene un singolo intero n (1 ≤ n ≤ ). La seconda riga contiene n interi separati da spazio, che rappresentano l’array a.
Output
Il programma deve stampare l’array delle somme prefisse di a.