Given an arithmetic series in arr and Q queries in the form of [L, R], where L is the left boundary of the range and R is the right boundary. The task is to find the sum of the AP elements in the given range.
Note: The range is 1-indexed and 1 ? L, R ? N, where N is the size of arr.
Examples:
Input: arr[] = {2, 4, 6, 8, 10, 12, 14, 16}, Q = [[2, 4], [2, 6], [5, 8]]
Output:
18
40
52
Explanation:
Range 1: arr = {4, 6, 8}. Therefore sum = 18
Range 2: arr = {4, 6, 8, 10, 12}. Therefore sum = 40
Range 3: arr = {10, 12, 14, 16}. Therefore sum = 52Input: arr[] = {7, 14, 21, 28, 35, 42}, Q = [[1, 6], [2, 4], [3, 3]]
Output:
147
63
21
Explanation:
Range 1: arr = {7, 14, 21, 28, 35, 42}. Therefore sum = 147
Range 2: arr = {14, 21, 28}. Therefore sum = 63
Range 3: arr = {21}. Therefore sum = 21
Approach: Since the given sequence is an arithmetic progression, the sum can be easily found in two steps efficiently:
- Multiply the first element of the range by the number of elements in the range.
- Add (d*k*(k+1))/2 to it, where d is the common difference of the AP and k is (number of elements in the range – 1) which corresponds to the number of gaps.
For example:
Suppose a[i] be the first element of the range, d is the common difference of AP and k+1 be the number of elements in the given range.
Then the sum of the range would be
= a[i] + a[i+1] + a[i+2] + ….. + a[i+k]
= a[i] + a[i] + d + a[i] + 2 * d + …. + a[i] + k * d
= a[i] * (k + 1) + d * (1 + 2 + … + k)
= a[i] * (k + 1) + (d * k * (k+1))/2
Below is the implementation of the above approach:
CPP
// C++ program to find the sum of elements // of an AP in the given range #include <bits/stdc++.h> using namespace std; // Function to find sum in the given range int findSum( int * arr, int n, int left, int right) { // Find the value of k int k = right - left; // Find the common difference int d = arr[1] - arr[0]; // Find the sum int ans = arr[left - 1] * (k + 1); ans = ans + (d * (k * (k + 1))) / 2; return ans; } // Driver code int main() { int arr[] = { 2, 4, 6, 8, 10, 12, 14, 16 }; int queries = 3; int q[queries][2] = { { 2, 4 }, { 2, 6 }, { 5, 6 } }; int n = sizeof (arr) / sizeof (arr[0]); for ( int i = 0; i < queries; i++) cout << findSum(arr, n, q[i][0], q[i][1]) << endl; } |
Java
// Java program to find the sum of elements // of an AP in the given range class GFG{ // Function to find sum in the given range static int findSum( int []arr, int n, int left, int right) { // Find the value of k int k = right - left; // Find the common difference int d = arr[ 1 ] - arr[ 0 ]; // Find the sum int ans = arr[left - 1 ] * (k + 1 ); ans = ans + (d * (k * (k + 1 ))) / 2 ; return ans; } // Driver code public static void main(String[] args) { int arr[] = { 2 , 4 , 6 , 8 , 10 , 12 , 14 , 16 }; int queries = 3 ; int q[][] = { { 2 , 4 }, { 2 , 6 }, { 5 , 6 } }; int n = arr.length; for ( int i = 0 ; i < queries; i++) System.out.print(findSum(arr, n, q[i][ 0 ], q[i][ 1 ]) + "\n" ); } } // This code is contributed by Princi Singh |
Python3
# Python program to find the sum of elements # of an AP in the given range # Function to find sum in the given range def findSum(arr, n, left, right): # Find the value of k k = right - left; # Find the common difference d = arr[ 1 ] - arr[ 0 ]; # Find the sum ans = arr[left - 1 ] * (k + 1 ); ans = ans + (d * (k * (k + 1 ))) / / 2 ; return ans; # Driver code if __name__ = = '__main__' : arr = [ 2 , 4 , 6 , 8 , 10 , 12 , 14 , 16 ]; queries = 3 ; q = [[ 2 , 4 ],[ 2 , 6 ],[ 5 , 6 ]]; n = len (arr); for i in range (queries): print (findSum(arr, n, q[i][ 0 ], q[i][ 1 ])); # This code is contributed by sapnasingh4991 |
C#
// C# program to find the sum of elements // of an AP in the given range using System; class GFG{ // Function to find sum in the given range static int findSum( int []arr, int n, int left, int right) { // Find the value of k int k = right - left; // Find the common difference int d = arr[1] - arr[0]; // Find the sum int ans = arr[left - 1] * (k + 1); ans = ans + (d * (k * (k + 1))) / 2; return ans; } // Driver code public static void Main(String[] args) { int []arr = { 2, 4, 6, 8, 10, 12, 14, 16 }; int queries = 3; int [,]q = { { 2, 4 }, { 2, 6 }, { 5, 6 } }; int n = arr.Length; for ( int i = 0; i < queries; i++) Console.Write(findSum(arr, n, q[i,0], q[i,1]) + "\n" ); } } // This code is contributed by PrinciRaj1992 |
Javascript
<script> // JavaScript program to find the sum of elements // of an AP in the given range // Function to find sum in the given range function findSum(arr, n, left, right) { // Find the value of k let k = right - left; // Find the common difference let d = arr[1] - arr[0]; // Find the sum let ans = arr[left - 1] * (k + 1); ans = ans + (d * (k * (k + 1))) / 2; return ans; } // Driver Code let arr = [ 2, 4, 6, 8, 10, 12, 14, 16 ]; let queries = 3; let q = [[ 2, 4 ], [ 2, 6 ], [ 5, 6 ]]; let n = arr.length; for (let i = 0; i < queries; i++) document.write(findSum(arr, n, q[i][0], q[i][1]) + "<br/>" ); </script> |
18 40 22
Time complexity: O(q), where q is the length of the given queries array.
Auxiliary Space: O(1)
Method 2: Using Prefix Sum
Approach:
- Create a prefix sum array for the given arithmetic series.
- For each query, calculate the sum of the range by subtracting the prefix sum at L-1 from the prefix sum at R.
- Output the sum for each query.
Implementation:
C++
#include <bits/stdc++.h> using namespace std; vector< int > arithmetic_series_sum( int arr[], int N, vector<vector< int >> queries) { // precompute prefix sum int prefixSum[N]; prefixSum[0] = arr[0]; for ( int i = 1; i < N; i++) { prefixSum[i] = prefixSum[i - 1] + arr[i]; } // process queries vector< int > ans; for ( int i = 0; i < queries.size(); i++) { int L = queries[i][0]; int R = queries[i][1]; int sum = prefixSum[R - 1] - prefixSum[L - 2]; ans.push_back(sum); } return ans; } int main() { int arr[] = {2, 4, 6, 8, 10, 12, 14, 16}; int N = sizeof (arr) / sizeof (arr[0]); // define queries vector<vector< int >> queries = {{2, 4},{2, 6},{5, 6}}; // call function to compute arithmetic series sum for queries vector< int > ans = arithmetic_series_sum(arr, N, queries); // print answers for ( int i = 0; i < ans.size(); i++) { cout << ans[i] << endl; } return 0; } |
Java
import java.util.ArrayList; public class GFG { public static ArrayList<Integer> arithmeticSeriesSum( int [] arr, int N, ArrayList<ArrayList<Integer> > queries) { // Precompute prefix sum int [] prefixSum = new int [N]; prefixSum[ 0 ] = arr[ 0 ]; for ( int i = 1 ; i < N; i++) { prefixSum[i] = prefixSum[i - 1 ] + arr[i]; } // Process queries ArrayList<Integer> ans = new ArrayList<>(); for ( int i = 0 ; i < queries.size(); i++) { int L = queries.get(i).get( 0 ); int R = queries.get(i).get( 1 ); int sum = prefixSum[R - 1 ] - (L > 1 ? prefixSum[L - 2 ] : 0 ); ans.add(sum); } return ans; } public static void main(String[] args) { int [] arr = { 2 , 4 , 6 , 8 , 10 , 12 , 14 , 16 }; int N = arr.length; // Define queries ArrayList<ArrayList<Integer> > queries = new ArrayList<>(); queries.add( new ArrayList<>(java.util.Arrays.asList( 2 , 4 ))); queries.add( new ArrayList<>(java.util.Arrays.asList( 2 , 6 ))); queries.add( new ArrayList<>(java.util.Arrays.asList( 5 , 6 ))); // Call function to compute arithmetic series sum // for queries ArrayList<Integer> ans = arithmeticSeriesSum(arr, N, queries); // Print answers for ( int i = 0 ; i < ans.size(); i++) { System.out.println(ans.get(i)); } } } |
Python3
def arithmetic_series_sum(arr, N, queries): # precompute prefix sum prefixSum = [ 0 ] * N prefixSum[ 0 ] = arr[ 0 ] for i in range ( 1 , N): prefixSum[i] = prefixSum[i - 1 ] + arr[i] # process queries ans = [] for i in range ( len (queries)): L = queries[i][ 0 ] R = queries[i][ 1 ] # Compute the sum using prefix sums sum = prefixSum[R - 1 ] - prefixSum[L - 2 ] ans.append( sum ) return ans if __name__ = = "__main__" : arr = [ 2 , 4 , 6 , 8 , 10 , 12 , 14 , 16 ] N = len (arr) # define queries queries = [[ 2 , 4 ], [ 2 , 6 ], [ 5 , 6 ]] # call function to compute arithmetic series sum for queries ans = arithmetic_series_sum(arr, N, queries) # print answers for i in range ( len (ans)): print (ans[i]) |
C#
using System; using System.Collections.Generic; class GFG { static List< int > ArithmeticSeriesSum( int [] arr, int N, List<List< int >> queries) { // precompute prefix sum int [] prefixSum = new int [N]; prefixSum[0] = arr[0]; for ( int i = 1; i < N; i++) { prefixSum[i] = prefixSum[i - 1] + arr[i]; } // process queries List< int > ans = new List< int >(); for ( int i = 0; i < queries.Count; i++) { int L = queries[i][0]; int R = queries[i][1]; int sum = prefixSum[R - 1] - (L - 2 >= 0 ? prefixSum[L - 2] : 0); ans.Add(sum); } return ans; } static void Main() { int [] arr = { 2, 4, 6, 8, 10, 12, 14, 16 }; int N = arr.Length; // define queries List<List< int >> queries = new List<List< int >> { new List< int > { 2, 4 }, new List< int > { 2, 6 }, new List< int > { 5, 6 } }; // call function to compute arithmetic series sum for queries List< int > ans = ArithmeticSeriesSum(arr, N, queries); // print answers foreach ( int value in ans) { Console.WriteLine(value); } } } |
Javascript
function arithmeticSeriesSum(arr, N, queries) { // precompute prefix sum let prefixSum = []; prefixSum[0] = arr[0]; for (let i = 1; i < N; i++) { prefixSum[i] = prefixSum[i - 1] + arr[i]; } // process queries let ans = []; for (let i = 0; i < queries.length; i++) { let L = queries[i][0]; let R = queries[i][1]; let sum = prefixSum[R - 1] - (L > 1 ? prefixSum[L - 2] : 0); ans.push(sum); } return ans; } let arr = [2, 4, 6, 8, 10, 12, 14, 16]; let N = arr.length; // define queries let queries = [[2, 4], [2, 6], [5, 6]]; // call function to compute arithmetic series sum for queries let ans = arithmeticSeriesSum(arr, N, queries); // print answers for (let i = 0; i < ans.length; i++) { console.log(ans[i]); } |
18 40 22
Time complexity: O(N + Q),N is the size of the arithmetic series and Q is the number of queries.
Auxiliary Space: O(N) for the prefix sum array.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!