# Constant time range add operation on an array

Given an array of size N which is initialized with all zeros. We are given many range add queries, which should be applied to this array. We need to print final updated array as our result.
Examples:

```N = 6
Arr = [0, 0, 0, 0, 0, 0]
Arr = [100, 100, 100, 0, 0, 0]
Arr = [100, 200, 200, 100, 100, 100]
Arr = [100, 200, 300, 200, 100, 100]
Which is the final updated array.
```

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

This problem can be solved using segment tree with lazy updates in O(log N) time per query but we can do better here, as update operation is not given. We can process each query in constant time using this logic, when a query to add V is given in range [a, b] we will add V to arr[a] and –V to arr[b+1] now if we want to get the actual values of array we will convert the above array into prefix sum array. See below example to understand,

```Arr = [0, 0, 0, 0, 0, 0]
Arr = [100, 0, 0, -100, 0, 0]
Arr = [100, 100, 0, -100, 0, 0, -100]
Arr = [100, 100, 100, -100, -100, 0, -100]
Now we will convert above operation array to prefix sum array as shown below,
Arr = [100, 200, 300, 200, 100, 100]
Which is the final updated array.
```

So in effect, when we add a value V to specific index of array, It represents adding V to all elements right to this index, that is why we add –V after range to remove its effect after its range of add query.
Please note in below code, if range spans till the last index, the addition of –V is omitted to be in memory limit of the array.

## C++

 `//  C++ program to get updated array after many array range ` `// add operation ` `#include ` `using` `namespace` `std; ` ` `  `//  Utility method to add value val, to range [lo, hi] ` `void` `add(``int` `arr[], ``int` `N, ``int` `lo, ``int` `hi, ``int` `val) ` `{ ` `    ``arr[lo] += val; ` `    ``if` `(hi != N - 1) ` `       ``arr[hi + 1] -= val; ` `} ` ` `  `//  Utility method to get actual array from operation array ` `void` `updateArray(``int` `arr[], ``int` `N) ` `{ ` `    ``//  convert array into prefix sum array ` `    ``for` `(``int` `i = 1; i < N; i++) ` `        ``arr[i] += arr[i - 1]; ` `} ` ` `  `//  method to print final updated array ` `void` `printArr(``int` `arr[], ``int` `N) ` `{ ` `    ``updateArray(arr, N); ` `    ``for` `(``int` `i = 0; i < N; i++) ` `        ``cout << arr[i] << ``" "``; ` `    ``cout << endl; ` `} ` ` `  `//  Driver code to test above methods ` `int` `main() ` `{ ` `    ``int` `N = 6; ` ` `  `    ``int` `arr[N] = {0}; ` ` `  `    ``//  Range add Queries ` `    ``add(arr, N, 0, 2, 100); ` `    ``add(arr, N, 1, 5, 100); ` `    ``add(arr, N, 2, 3, 100); ` ` `  `    ``printArr(arr, N); ` `    ``return` `0; ` `} `

## Java

 `// Java program to get updated array after ` `// many array range add operation ` `import` `java.io.*; ` `  `  `class` `GFG  ` `{ ` `    ``// Utility method to add value val, ` `    ``// to range [lo, hi] ` `    ``static` `void` `add(``int` `arr[], ``int` `N, ``int` `lo, ` `                           ``int` `hi, ``int` `val) ` `    ``{ ` `        ``arr[lo] += val; ` `        ``if` `(hi != N - ``1``) ` `           ``arr[hi + ``1``] -= val; ` `    ``} ` `     `  `    ``// Utility method to get actual array from  ` `    ``// operation array ` `    ``static` `void` `updateArray(``int` `arr[], ``int` `N) ` `    ``{ ` `        ``// convert array into prefix sum array ` `        ``for` `(``int` `i = ``1``; i < N; i++) ` `            ``arr[i] += arr[i - ``1``]; ` `    ``} ` `      `  `    ``// method to print final updated array ` `    ``static` `void` `printArr(``int` `arr[], ``int` `N) ` `    ``{ ` `        ``updateArray(arr, N); ` `        ``for` `(``int` `i = ``0``; i < N; i++) ` `            ``System.out.print(``""``+arr[i]+``" "``); ` `        ``System.out.print(``"\n"``); ` `    ``} ` `      `  `    ``// Driver code to test above methods ` `    ``public` `static` `void` `main (String[] args)  ` `    ``{ ` `        ``int` `N = ``6``; ` `  `  `        ``int` `arr[] = ``new` `int``[N]; ` `      `  `        ``// Range add Queries ` `        ``add(arr, N, ``0``, ``2``, ``100``); ` `        ``add(arr, N, ``1``, ``5``, ``100``); ` `        ``add(arr, N, ``2``, ``3``, ``100``); ` `      `  `        ``printArr(arr, N); ` `    ``} ` `} ` ` `  `// This code is contributed by Prakriti Gupta `

## Python3

 `# Python3 program to get updated array  ` `# after many array range add operation ` ` `  `# Utility method to add value ` `# val, to range [lo, hi] ` `def` `add(arr, N, lo, hi, val): ` ` `  `    ``arr[lo] ``+``=` `val ` `    ``if` `(hi !``=` `N ``-` `1``): ` `        ``arr[hi ``+` `1``] ``-``=` `val ` ` `  `# Utility method to get actual ` `# array from operation array ` `def` `updateArray(arr, N): ` ` `  `    ``# convert array into prefix sum array ` `    ``for` `i ``in` `range``(``1``, N): ` `        ``arr[i] ``+``=` `arr[i ``-` `1``] ` ` `  `# method to print final updated array ` `def` `printArr(arr, N): ` ` `  `    ``updateArray(arr, N) ` `    ``for` `i ``in` `range``(N): ` `        ``print``(arr[i], end ``=` `" "``) ` `    ``print``() ` ` `  `# Driver code  ` `N ``=` `6` `arr ``=` `[``0` `for` `i ``in` `range``(N)] ` ` `  `# Range add Queries ` `add(arr, N, ``0``, ``2``, ``100``) ` `add(arr, N, ``1``, ``5``, ``100``) ` `add(arr, N, ``2``, ``3``, ``100``) ` ` `  `printArr(arr, N) ` ` `  `# This code is contributed by Anant Agarwal. `

## C#

 `// C# program to get updated array after ` `// many array range add operation ` `using` `System; ` ` `  `class` `GFG { ` `     `  `    ``// Utility method to add value val, ` `    ``// to range [lo, hi] ` `    ``static` `void` `add(``int` `[]arr, ``int` `N,  ` `                    ``int` `lo, ``int` `hi,  ` `                    ``int` `val) ` `    ``{ ` `        ``arr[lo] += val; ` `        ``if` `(hi != N - 1) ` `        ``arr[hi + 1] -= val; ` `    ``} ` `     `  `    ``// Utility method to get actual   ` `    ``// array from operation array ` `    ``static` `void` `updateArray(``int` `[]arr, ``int` `N) ` `    ``{ ` `        ``// convert array into ` `        ``// prefix sum array ` `        ``for` `(``int` `i = 1; i < N; i++) ` `            ``arr[i] += arr[i - 1]; ` `    ``} ` `     `  `    ``// method to print final updated array ` `    ``static` `void` `printArr(``int` `[]arr, ``int` `N) ` `    ``{ ` `        ``updateArray(arr, N); ` `        ``for` `(``int` `i = 0; i < N; i++) ` `            ``Console.Write(``""` `+ arr[i] + ``" "``); ` `        ``Console.Write(``"\n"``); ` `    ``} ` `     `  `    ``// Driver code  ` `    ``public` `static` `void` `Main ()  ` `    ``{ ` `        ``int` `N = 6; ` ` `  `        ``int` `[]arr = ``new` `int``[N]; ` `     `  `        ``// Range add Queries ` `        ``add(arr, N, 0, 2, 100); ` `        ``add(arr, N, 1, 5, 100); ` `        ``add(arr, N, 2, 3, 100); ` `     `  `        ``printArr(arr, N); ` `    ``} ` `} ` ` `  `// This code is contributed by Nitin Mittal. `

## PHP

 ` `

Output:

```100 200 300 200 100 100
```

This article is contributed by Utkarsh Trivedi. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up

Improved By : nitin mittal, chitranayal

Article Tags :
Practice Tags :

53

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.