# Prefix Sum : Query Time O(1) : Pre-processing Time O(n)

Written By : Shivani Tiwari

Range Sum is a popular problem in competitive programming and technical interviews. Range Sum problem asks sum of the elements in a range in a given array. Naïve approach requires O(N*Q) time which can be improved to be O(N+Q) using Prefix Sum approach. N is the size of the array and Q is the number of queries.

Prefix Sum technique is used to give range sum in an array in O(1) for each query with a one time pre-processing.

Let’s see an example for this with a basic statement.

Suppose you are given with an array of N integers (both negative and positive) and Q queries. Each query is of the form of two integers L and R where you have to find the sum of all the integers between L and R (inclusive).
Constraints : (N <= 10^5) ,  (1 <= L, R <= 10^5) and (Q <= 10^5)
Example :   N=7, Q=3
Given Array : arr[]={4,5,-7,11,13,15,1}

arr–>

Sum of arr to arr is : 4+5+(-7)+11+13 = 26
Sum of arr to arr is  : 5+(-7)+11= 9
Sum of arr to arr is  : (-7)+11+13+15+1= 33

## Naive Approach

For each query, let’s take a variable sum_range = 0 and run a loop from L to R index and store the sum in sum_range. We can do this for each query.
We will end up traversing the entire array length and there are Q such queries. So the time complexity would be O(N*Q). Therefore, this approach is inefficient.

## Prefix Sum Approach

### Pre-processing

Before answering any query, let’s calculate the cumulative sum of the array and store it in the array (let’s say prefix_array). The code for creating a prefix array would look like this :

``````prefix_array = a
{
for(i = 2; i <= n; ++i) {

prefix_array[i] = prefix_array[i-1] + a[i];
}
}
``````

prefix_array–>

After creating this prefix array, each query of range (L, R) can be answered in O(1) by using
sum of arr[L] to arr[R] = prefix_array[R] – prefix_array[L-1]

Now the above queries can be answered in O(1) time as follows:
Sum of arr to arr = prefix_array – prefix_array
Sum of arr to arr  =  prefix_array – prefix_array
Sum of arr to arr  =  prefix_array – prefix_array

Key Idea : First take the cumulative sum from 0 to R and excluded the sum from 0 to L-1 from it, so the remaining sum is the sum from L to R.

Time complexity is O(N+Q).