Prefix Sum Array – Implementation and Applications in Competitive Programming

02 Jul, 2022
Given an array arr[] of size n, its prefix sum array is another array prefixSum[] of the same size, such that the value of prefixSum[i] is arr[0] + arr[1] + arr[2] ... arr[i].
Examples : 
Input  : arr[] = {10, 20, 10, 5, 15}
Output : prefixSum[] = {10, 30, 40, 45, 60}

Explanation : While traversing the array, update 
the element by adding it with its previous element.
prefixSum[0] = 10, 
prefixSum[1] = prefixSum[0] + arr[1] = 30, 
prefixSum[2] = prefixSum[1] + arr[2] = 40 and so on.
To fill the prefix sum array, we run through index 1 to last and keep on adding the present element with the previous value in the prefix sum array.Below is the implementation : 
C++
C
Java
Python3
C#
PHP
Javascript
// C++ program for Implementing prefix sum array#include <bits/stdc++.h>using namespace std;  // Fills prefix sum arrayvoid fillPrefixSum(int arr[], int n, int prefixSum[]){    prefixSum[0] = arr[0];    // Adding present element with previous element    for (int i = 1; i < n; i++)        prefixSum[i] = prefixSum[i - 1] + arr[i];}  // Driver Codeint main(){    int arr[] = { 10, 4, 16, 20 };    int n = sizeof(arr) / sizeof(arr[0]);    int prefixSum[n];    fillPrefixSum(arr, n, prefixSum);    for (int i = 0; i < n; i++)        cout << prefixSum[i] << " ";}  // This code is contributed by Aditya Kumar (adityakumar129)
// C program for Implementing prefix sum array#include <stdio.h>  // Fills prefix sum arrayvoid fillPrefixSum(int arr[], int n, int prefixSum[]){    prefixSum[0] = arr[0];      // Adding present element with previous element    for (int i = 1; i < n; i++)        prefixSum[i] = prefixSum[i - 1] + arr[i];}  // Driver Codeint main(){    int arr[] = { 10, 4, 16, 20 };    int n = sizeof(arr) / sizeof(arr[0]);    int prefixSum[n];    fillPrefixSum(arr, n, prefixSum);    for (int i = 0; i < n; i++)        cout << prefixSum[i] << " ";}  // This code is contributed by Aditya Kumar (adityakumar129)
// Java Program for Implementing prefix sum arrayclassclass Prefix {    // Fills prefix sum array    static void fillPrefixSum(int arr[], int n, int prefixSum[])    {        prefixSum[0] = arr[0];        // Adding present element with previous element        for (int i = 1; i < n; ++i)            prefixSum[i] = prefixSum[i - 1] + arr[i];    }      // Driver code    public static void main(String[] args)    {        int arr[] = { 10, 4, 16, 20 };        int n = arr.length;        int prefixSum[] = new int[n];        fillPrefixSum(arr, n, prefixSum);        for (int i = 0; i < n; i++)            System.out.print(prefixSum[i] + " ");        System.out.println("");    }}  // This code is contributed by Aditya Kumar (adityakumar129)
# Python Program for Implementing # prefix sum array  # Fills prefix sum arraydef fillPrefixSum(arr, n, prefixSum):      prefixSum[0] = arr[0]      # Adding present element    # with previous element    for i in range(1, n):        prefixSum[i] = prefixSum[i - 1] + arr[i]  # Driver codearr =[10, 4, 16, 20 ]n = len(arr)  prefixSum = [0 for i in range(n + 1)]  fillPrefixSum(arr, n, prefixSum)  for i in range(n):    print(prefixSum[i], " ", end ="")  # This code is contributed# by Anant Agarwal.
// C# Program for Implementing// prefix sum arrayclassusing System;  class GFG {    // Fills prefix sum array    static void fillPrefixSum(int[] arr, int n,                              int[] prefixSum)    {        prefixSum[0] = arr[0];          // Adding present element        // with previous element        for (int i = 1; i < n; ++i)            prefixSum[i] = prefixSum[i - 1] + arr[i];    }      // Driver code    public static void Main()    {        int[] arr = { 10, 4, 16, 20 };        int n = arr.Length;        int[] prefixSum = new int[n];          fillPrefixSum(arr, n, prefixSum);          for (int i = 0; i < n; i++)            Console.Write(prefixSum[i] + " ");        Console.Write("");    }}  // This Code is Contributed by nitin mittal
<?php// PHP program for // Implementing prefix // sum array  // Fills prefix sum arrayfunction fillPrefixSum($arr,                        $n){    $prefixSum = array();    $prefixSum[0] = $arr[0];      // Adding present element     // with previous element    for ($i = 1; $i < $n; $i++)        $prefixSum[$i] = $prefixSum[$i - 1] +                                     $arr[$i];              for ($i = 0; $i < $n; $i++)        echo $prefixSum[$i] . " ";}  // Driver Code$arr = array(10, 4, 16, 20);$n = count($arr);  fillPrefixSum($arr, $n);  // This code is contributed// by Sam007?>
<script>      // JavaScript Program for Implementing    // prefix sum arrayclass          // Fills prefix sum array    function fillPrefixSum(arr, n, prefixSum)    {        prefixSum[0] = arr[0];           // Adding present element        // with previous element        for (let i = 1; i < n; ++i)            prefixSum[i] = prefixSum[i - 1] + arr[i];    }          let arr = [ 10, 4, 16, 20 ];    let n = arr.length;    let prefixSum = new Array(n);      fillPrefixSum(arr, n, prefixSum);      for (let i = 0; i < n; i++)        document.write(prefixSum[i] + " ");    document.write("");      </script>
Output: 
10 14 30 50
Given an array arr[] of size n. Given Q queries and in each query given L and R, print sum of array elements from index L to R.
C++14
Java
Python3
C#
C++14
#include <iostream>using namespace std;const int N = 1e5+10;int a[N];int pf[N];  int main() {int n;cin >> n;for(int i=1; i<=n; i++){    cin >> a[i];    if(i==0)        pf[i]=a[i];    else        pf[i] = pf[i-1] + a[i];    //cout<<pf[i];}int q;cin >> q;while(q--){    int l, r;    cin >> l >> r;//Calculating sum from l to r.    if(r>n || l<1)    {        cout<<"Please input in range 1 to "<<n<<endl;        break;    }    if(l==1)        cout << pf[r] << endl;    else         cout << pf[r] - pf[l-1] << endl;      }return 0;}
import java.util.*;  class GFG {      public static void main(String[] args)    {        int n = 6;        int[] a = { 3, 6, 2, 8, 9, 2 };        int[] pf = new int[n + 2];        pf[0] = 0;        for (int i = 0; i < n; i++) {            pf[i + 1] = pf[i] + a[i];        }          int[][] q            = { { 2, 3 }, { 4, 6 }, { 1, 5 }, { 3, 6 } };        for (int i = 0; i < q.length; i++) {            int l = q[i][0];            int r = q[i][1];              // Calculating sum from r to l.            System.out.print(pf[r] - pf[l - 1] + "\n");        }    }}  // This code is contributed by umadevi9616
if __name__ == '__main__':    n = 6;    a = [ 3, 6, 2, 8, 9, 2 ];    pf = [0 for i in range(n+2)];    for i in range(n):        pf[i + 1] = pf[i] + a[i];            q =[ [ 2, 3 ],[ 4, 6 ],[ 1, 5 ],[ 3, 6  ]];    for i in range(4):        l = q[i][0];        r = q[i][1];          # Calculating sum from r to l.        print(pf[r] - pf[l - 1] );      # This code is contributed by gauravrajput1 
using System;  public class GFG {      public static void Main(String[] args) {        int n = 6;        int[] a = { 3, 6, 2, 8, 9, 2 };        int[] pf = new int[n + 2];        pf[0] = 0;        for (int i = 0; i < n; i++) {            pf[i + 1] = pf[i] + a[i];        }          int[,] q = { { 2, 3 }, { 4, 6 }, { 1, 5 }, { 3, 6 } };        for (int i = 0; i < q.GetLength(0); i++) {            int l = q[i,0];            int r = q[i,1];              // Calculating sum from r to l.            Console.Write(pf[r] - pf[l - 1] + "\n");        }    }}  // This code is contributed by gauravrajput1 
<script>              var n = 6;        var a = [ 3, 6, 2, 8, 9, 2 ];        var pf = Array(n + 2).fill(0);        pf[0] = 0;        for (i = 0; i < n; i++) {            pf[i + 1] = pf[i] + a[i];        }          var q = [ [ 2, 3 ], [ 4, 6 ], [ 1, 5 ], [ 3, 6 ] ];        for (i = 0; i < q.length; i++) {            var l = q[i][0];            var r = q[i][1];              // Calculating sum from r to l.            document.write(pf[r-1] - pf[l - 1] + "<br/>");        }  // This code is contributed by gauravrajput1</script>
Example:  
Input : n = 6
       a[ ] = {3, 6, 2, 8, 9, 2}
       q = 4
       l = 2, r = 3.
       l = 4, r = 6.
       l = 1, r = 5.
       l = 3, r = 6.
Output :  8
          19
          28
          21
Time Complexity: O(n)
Applications : 
Equilibrium index of an array: The equilibrium index of an array is an index such that the sum of elements at lower indexes is equal to the sum of elements at higher indexes.
Find if there is a subarray with 0 sum: Given an array of positive and negative numbers, find if there is a subarray (of size at least one) with 0 sum.
Maximum subarray size, such that all subarrays of that size have sum less than k: Given an array of n positive integers and a positive integer k, the task is to find the maximum subarray size such that all subarrays of that size have the sum of elements less than k.
Find the prime numbers which can written as sum of most consecutive primes: Given an array of limits. For every limit, find the prime number which can be written as the sum of the most consecutive primes smaller than or equal to the limit.
Longest Span with same Sum in two Binary arrays : Given two binary arrays, arr1[] and arr2[] of the same size n. Find the length of the longest common span (i, j) where j >= i such that arr1[i] + arr1[i+1] + .... + arr1[j] = arr2[i] + arr2[i+1] + .... + arr2[j].
Maximum subarray sum modulo m: Given an array of n elements and an integer m. The task is to find the maximum value of the sum of its subarray modulo m i.e find the sum of each subarray mod m and print the maximum value of this modulo operation.
Maximum subarray size, such that all subarrays of that size have sum less than k: Given an array of n positive integers and a positive integer k, the task is to find the maximum subarray size such that all subarrays of that size have sum of elements less than k.
Maximum occurred integer in n ranges : Given n ranges of the form L and R, the task is to find the maximum occurring integer in all the ranges. If more than one such integer exits, print the smallest one.
Minimum cost for acquiring all coins with k extra coins allowed with every coin: You are given a list of N coins of different denominations. you can pay an amount equivalent to any 1 coin and can acquire that coin. In addition, once you have paid for a coin, we can choose at most K more coins and can acquire those for free. The task is to find the minimum amount required to acquire all the N coins for a given value of K.
Random number generator in arbitrary probability distribution fashion: Given n numbers, each with some frequency of occurrence. Return a random number with a probability proportional to its frequency of occurrence.
An Example Problem : Consider an array of size n with all initial values as 0. Perform the given ‘m’ add operations from index ‘a’ to ‘b’ and evaluate the highest element in the array. An add operation adds 100 to all elements from a to b (both inclusive). 
Example:  
Input : n = 5 // We consider array {0, 0, 0, 0, 0}
        m = 3.
        a = 2, b = 4.
        a = 1, b = 3.
        a = 1, b = 2.
Output : 300

Explanation : 

After I operation -
A : 0 100 100 100 0

After II operation -
A : 100 200 200 100 0

After III operation -
A : 200 300 200 100 0

Highest element : 300
A simple approach is running a loop ‘m’ times. Inputting a and b and running a loop from a to b, adding all elements by 100. The efficient approach using Prefix Sum Array: 
1 : Run a loop for 'm' times, inputting 'a' and 'b'.
2 : Add 100 at index 'a-1' and subtract 100 from index 'b'.
3 : After completion of 'm' operations, compute the prefix sum array.
4 : Scan the largest element and we're done.
What we did was adding 100 at ‘a’ because this will add 100 to all elements while taking the prefix sum array. Subtracting 100 from ‘b+1’ will reverse the changes made by adding 100 to elements from ‘b’ onward.For better understanding : 
After I operation -
A : 0 100 0 0 -100 
Prefix Sum Array : 0 100 100 100 0

After II operation -
A : 100 100 0 -100 -100
Prefix Sum Array : 100 200 200 100 0

After III operation -
A : 200 100 -100 -100 -100
Prefix Sum Array : 200 300 200 100 0

Final Prefix Sum Array : 200 300 200 100 0 

The required highest element : 300
C++14
Java
Python3
C#
Javascript
#include <bits/stdc++.h>using namespace std;  int find(int m, vector<pair<int,int>> q){    int mx = 0;    vector<int> pre(5,0);          for (int i = 0; i < m; i++)     {            // take input a and b        int a = q[i].first, b = q[i].second;                // add 100 at first index and        // subtract 100 from last index                // pre[1] becomes 100        pre[a-1] += 100;                    // pre[4] becomes -100 and this        pre[b] -=100;            // continues m times as we input diff. values of a and b    }    for (int i = 1; i < 5; i++)     {        // add all values in a cumulative way        pre[i] += pre[i - 1];                  // keep track of max value        mx = max(mx, pre[i]);    }                                            return mx;}  // Driver Codeint main(){          int m = 3;    vector<pair<int,int>> q = {{2,4},{1,3},{1,2}};            // Function call    cout<< find(m,q);    return 0;}
import java.util.*;  class GFG{    static class pair    {         int first, second;         public pair(int first, int second)          {             this.first = first;             this.second = second;         }        }static int find(int m, pair []q){    int mx = 0;    int []pre = new int[5];          for (int i = 0; i < m; i++)     {                    // take input a and b        int a = q[i].first, b = q[i].second;                // add 100 at first index and        // subtract 100 from last index                // pre[1] becomes 100        pre[a-1] += 100;                    // pre[4] becomes -100 and this        pre[b] -=100;                   // continues m times as we input diff. values of a and b    }    for (int i = 1; i < 5; i++)     {                // add all values in a cumulative way        pre[i] += pre[i - 1];                  // keep track of max value        mx = Math.max(mx, pre[i]);    }                                            return mx;}  // Driver Codepublic static void main(String[] args){          int m = 3;   pair[] q = {new pair(2,4),new pair(1,3), new pair(1,2)};            // Function call    System.out.print( find(m,q));}}  // This code is contributed by gauravrajput1 
# Python implementation of the approachdef find( m, q):    mx = 0    pre = [0 for i in range(5) ]          for i in range(m):        # take input a and b        a,b = q[i][0], q[i][1]                # add 100 at first index and        # subtract 100 from last index                # pre[1] becomes 100        pre[a-1] += 100                   # pre[4] becomes -100 and this        pre[b] -=100;                    # continues m times as we input diff. values of a and b     for i in range(1,5):                # add all values in a cumulative way        pre[i] += pre[i - 1]                  # keep track of max value        mx = max(mx, pre[i])                                 return mx    # Driver Codem = 3q = [[2,4],[1,3],[1,2]]  # Function callprint(find(m,q))  # This code is contributed by rohitsingh07052
using System;  public class GFG{   public class pair    {        public int first, second;         public pair(int first, int second)          {             this.first = first;             this.second = second;         }        }static int find(int m, pair []q){    int mx = 0;    int []pre = new int[5];          for (int i = 0; i < m; i++)     {                    // take input a and b        int a = q[i].first, b = q[i].second;                // add 100 at first index and        // subtract 100 from last index                // pre[1] becomes 100        pre[a-1] += 100;                    // pre[4] becomes -100 and this        pre[b] -=100;                   // continues m times as we input diff. values of a and b    }    for (int i = 1; i < 5; i++)     {                // add all values in a cumulative way        pre[i] += pre[i - 1];                  // keep track of max value        mx = Math.Max(mx, pre[i]);    }                                          return mx;}  // Driver Codepublic static void Main(String[] args){    int m = 3;   pair[] q = {new pair(2,4),new pair(1,3), new pair(1,2)};            // Function call    Console.Write( find(m,q));}}  // This code is contributed by gauravrajput1.
<script>  function find( m,q){    let mx = 0;    let pre = [0,0,0,0,0];          for (let i = 0; i < m; i++)     {            // take input a and b        let a = q[i][0], b = q[i][1];                // add 100 at first index and        // subtract 100 from last index                // pre[1] becomes 100        pre[a-1] += 100;                    // pre[4] becomes -100 and this        pre[b] -=100;            // continues m times as we input diff. values of a and b    }    for (let i = 1; i < 5; i++)     {        // add all values in a cumulative way        pre[i] += pre[i - 1];                  // keep track of max value        mx = Math.max(mx, pre[i]);    }                                            return mx;}  // Driver Codelet m = 3;let q = [[2,4],[1,3],[1,2]];            // Function call    document.write(find(m,q));  </script>
300
Recent Articles on Prefix Sum Technique
Practice Problems on Prefix Sum
DSA Self Paced – The Most used and Trusted Course on DSA
This article is contributed by Rohit Thapliyal. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
nitin mittal
Sam007
varadthokal3
chayanranparacr
rohitsingh07052
divyeshrabadiya07
hrushipatil2019262
GauravRajput1
umadevi9616
sweetygupta
adityakumar129
prefix-sum
Arrays
Competitive Programming
prefix-sum
Arrays
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Multidimensional Arrays in Java
Introduction to Arrays
Given an array A[] and a number x, check for pair in A[] with sum as x (aka Two Sum)
K'th Smallest/Largest Element in Unsorted Array | Set 1
Subset Sum Problem | DP-25
Competitive Programming - A Complete Guide
Practice for cracking any coding interview
Arrow operator -> in C/C++ with Examples
Modulo 10^9+7 (1000000007)
Fast I/O for Competitive Programming