Les sommes préfixes sont très utiles lorsqu’on travaille avec des intervalles dans les tableaux. Il est souvent possible d’optimiser un programme en tirant parti de la somme préfixe d’un tableau, plutôt que de recalculer la somme à chaque fois.
Imaginons un problème où nous devons répondre à un grand nombre de requêtes (par exemple, des millions) du type « Quelle est la somme des éléments du tableau a depuis le début jusqu’à ? ». Avec une approche naïve, nous calculerions à chaque fois la somme a[0] + a[1] + a[2] + ... + a[].
Nous pourrions lancer une boucle for pour additionner a[0] + a[1] + a[2] + ... + a[] pour chaque requête, ce qui entraîne beaucoup d’opérations répétitives :
On remarque que la première partie des calculs est toujours la même. Avant de calculer res2, nous connaissons déjà le résultat de a[0] + a[1] + a[2] + a[3], qui est exactement res1. Avant de calculer res4, nous connaissons déjà le résultat de a[0] + a[1] + a[2] + a[3] + a[4] + a[5]. Nous pouvons donc optimiser ces calculs et répondre aux requêtes instantanément, au lieu de lancer une boucle for à chaque fois.
Pour cela, nous allons créer un nouveau tableau p de sommes préfixes. Les éléments de p représenteront la somme des éléments du tableau a jusqu’à l’indice correspondant. Grâce à ce tableau de sommes préfixes, la réponse à chaque requête se résumera à accéder directement à un élément de p :
On voit un schéma récurrent : pour calculer l’élément suivant dans p, on reprend le résultat précédent et on y ajoute le nouvel élément de a. Ainsi, nous réutilisons les calculs déjà effectués sans avoir besoin de tout additionner de nouveau :
Ce tableau de sommes préfixes peut être calculé en une seule boucle for de complexité linéaire, plutôt que via de multiples additions répétées. Une fois le tableau p obtenu, toutes les requêtes sont traitées instantanément : p[i] contient déjà la somme a[0] + a[1] + a[2] + ... + a[i]. Ainsi, pour chaque requête , la réponse sera simplement p[].
Pouvez-vous calculer le tableau de sommes préfixes maintenant ?
Entrée
La première ligne de l’entrée contient un entier n (1 ≤ n ≤ ). La deuxième ligne contient n entiers séparés par des espaces, représentant le tableau a.
Sortie
Le programme doit afficher le tableau des sommes préfixes de a.