Range queries for alternatively addition and subtraction on given Array
Last Updated :
07 Apr, 2022
Given an array arr[] of N integers and Q queries where every row consists of two numbers L and R which denotes the range [L, R], the task is to find the value of alternate addition and subtraction of the array element between range [L, R].
Examples:
Input: arr[] = {10, 13, 15, 2, 45, 31, 22, 3, 27}, Q[][] = {{2, 5}, {6, 8}, {1, 7}, {4, 8}, {0, 5}}
Output: 27 46 -33 60 24
Explanation:
Result of query {2, 5} is 27 ( 15 – 2 + 45 – 31)
Result of query {6, 8} is 46 ( 22 – 3 + 27)
Result of query {1, 7} is -33 ( 13 – 15 + 2 – 45 + 31 – 22 + 3)
Result of query {4, 8} is 60 ( 45 – 31 + 22 – 3 + 27)
Result of query {0, 5} is 24 ( 10 – 13 + 15 – 2 + 45 – 31)
Input: arr[] = {1, 1, 1, 1, 1, 1, 1, 1, 1}, Q[] = {{2, 5}, {6, 8}, {1, 7}, {4, 8}, {0, 5}}
Output: 0 1 1 1 0
Naive Approach: The naive idea is to iterate from index L to R for each query and find the value of alternatively adding and subtracting the elements of the array and print the value after the operations are performed.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
struct Query {
int L, R;
};
int findResultUtil( int arr[],
int L, int R)
{
int result = 0;
bool flag = false ;
for ( int i = L; i <= R; i++) {
if (flag == false ) {
result = result + arr[i];
flag = true ;
}
else {
result = result - arr[i];
flag = false ;
}
}
return result;
}
void findResult( int arr[], int n,
Query q[], int m)
{
for ( int i = 0; i < m; i++) {
cout << findResultUtil(arr,
q[i].L,
q[i].R)
<< " " ;
}
}
int main()
{
int arr[] = { 10, 13, 15, 2, 45,
31, 22, 3, 27 };
int n = sizeof (arr) / sizeof (arr[0]);
Query q[] = { { 2, 5 }, { 6, 8 },
{ 1, 7 }, { 4, 8 },
{ 0, 5 } };
int m = sizeof (q) / sizeof (q[0]);
findResult(arr, n, q, m);
return 0;
}
|
Java
import java.util.*;
class GFG{
static class Query
{
int L, R;
public Query( int l, int r)
{
super ();
L = l;
R = r;
}
};
static int findResultUtil( int arr[],
int L, int R)
{
int result = 0 ;
boolean flag = false ;
for ( int i = L; i <= R; i++)
{
if (flag == false )
{
result = result + arr[i];
flag = true ;
}
else
{
result = result - arr[i];
flag = false ;
}
}
return result;
}
static void findResult( int arr[], int n,
Query q[], int m)
{
for ( int i = 0 ; i < m; i++)
{
System.out.print(findResultUtil(arr,
q[i].L, q[i].R) + " " );
}
}
public static void main(String[] args)
{
int arr[] = { 10 , 13 , 15 , 2 , 45 ,
31 , 22 , 3 , 27 };
int n = arr.length;
Query q[] = { new Query( 2 , 5 ), new Query( 6 , 8 ),
new Query( 1 , 7 ), new Query( 4 , 8 ),
new Query( 0 , 5 ) };
int m = q.length;
findResult(arr, n, q, m);
}
}
|
Python3
def findResultUtil(arr, L, R):
result = 0
flag = False
for i in range (L, R + 1 ):
if (flag = = False ):
result = result + arr[i]
flag = True
else :
result = result - arr[i]
flag = False
return result
def findResult(arr, n, q, m):
for i in range (m):
print (findResultUtil(arr,
q[i][ 0 ],
q[i][ 1 ]),
end = " " )
if __name__ = = '__main__' :
arr = [ 10 , 13 , 15 , 2 , 45 ,
31 , 22 , 3 , 27 ]
n = len (arr)
q = [ [ 2 , 5 ], [ 6 , 8 ],
[ 1 , 7 ], [ 4 , 8 ],
[ 0 , 5 ] ]
m = len (q)
findResult(arr, n, q, m)
|
C#
using System;
class GFG{
class Query
{
public int L, R;
public Query( int l, int r)
{
L = l;
R = r;
}
};
static int findResultUtil( int []arr,
int L, int R)
{
int result = 0;
bool flag = false ;
for ( int i = L; i <= R; i++)
{
if (flag == false )
{
result = result + arr[i];
flag = true ;
}
else
{
result = result - arr[i];
flag = false ;
}
}
return result;
}
static void findResult( int []arr, int n,
Query []q, int m)
{
for ( int i = 0; i < m; i++)
{
Console.Write(findResultUtil(arr,
q[i].L, q[i].R) + " " );
}
}
public static void Main(String[] args)
{
int []arr = { 10, 13, 15, 2, 45,
31, 22, 3, 27 };
int n = arr.Length;
Query []q = { new Query(2, 5), new Query(6, 8),
new Query(1, 7), new Query(4, 8),
new Query(0, 5) };
int m = q.Length;
findResult(arr, n, q, m);
}
}
|
Javascript
<script>
function findResultUtil(arr, L, R)
{
var result = 0;
var flag = false ;
for ( var i = L; i <= R; i++) {
if (flag == false ) {
result = result + arr[i];
flag = true ;
}
else {
result = result - arr[i];
flag = false ;
}
}
return result;
}
function findResult(arr, n, q, m)
{
for ( var i = 0; i < m; i++) {
document.write( findResultUtil(arr,
q[i][0],
q[i][1])
+ " " );
}
}
var arr = [10, 13, 15, 2, 45,
31, 22, 3, 27 ];
var n = arr.length;
var q = [ [ 2, 5 ], [ 6, 8 ],
[ 1, 7 ], [ 4, 8 ],
[ 0, 5 ] ];
var m = q.length;
findResult(arr, n, q, m);
</script>
|
Time Complexity: O(N*Q)
Auxiliary Space: O(1)
Efficient Approach: The efficient approach is to use Prefix Sum Array to solve the above problem. Below are the steps:
- Initialize the first element of prefix array(say pre[]) to first element of the arr[].
- Traverse through an index from 1 to N-1 and alternative add and subtract the elements of arr[i] from pre[i-1] and store it in pre[i] to make a prefix array.
- Now, Iterate through each query from 1 to Q, and find the result on the basis of the below cases:
- Case 1: If L is zero then result is pre[R].
- Case 2: If L is non-zero, find the result using the equation:
result = Query(L, R) = pre[R] – pre[L - 1]
- If L is odd multiply the above result by -1.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
struct Query {
int L, R;
};
void fillPrefixArray( int arr[], int n,
int prefixArray[])
{
prefixArray[0] = arr[0];
for ( int i = 1; i < n; i++) {
if (i % 2 == 0) {
prefixArray[i]
= prefixArray[i - 1]
+ arr[i];
}
else {
prefixArray[i]
= prefixArray[i - 1]
- arr[i];
}
}
}
int findResultUtil( int prefixArray[],
int L, int R)
{
int result;
if (L == 0) {
result = prefixArray[R];
}
else {
result = prefixArray[R]
- prefixArray[L - 1];
}
if (L & 1) {
result = result * (-1);
}
return result;
}
void findResult( int arr[], int n,
Query q[], int m)
{
int prefixArray[n];
fillPrefixArray(arr, n, prefixArray);
for ( int i = 0; i < m; i++) {
cout << findResultUtil(prefixArray,
q[i].L,
q[i].R)
<< " " ;
}
}
int main()
{
int arr[] = { 10, 13, 15, 2, 45,
31, 22, 3, 27 };
int n = sizeof (arr) / sizeof (arr[0]);
Query q[] = { { 2, 5 }, { 6, 8 },
{ 1, 7 }, { 4, 8 },
{ 0, 5 } };
int m = sizeof (q) / sizeof (q[0]);
findResult(arr, n, q, m);
return 0;
}
|
Java
import java.util.*;
class GFG{
static class Query
{
int L, R;
public Query( int l, int r)
{
super ();
L = l;
R = r;
}
};
static void fillPrefixArray( int arr[], int n,
int prefixArray[])
{
prefixArray[ 0 ] = arr[ 0 ];
for ( int i = 1 ; i < n; i++)
{
if (i % 2 == 0 )
{
prefixArray[i] = prefixArray[i - 1 ] +
arr[i];
}
else
{
prefixArray[i] = prefixArray[i - 1 ] -
arr[i];
}
}
}
static int findResultUtil( int prefixArray[],
int L, int R)
{
int result;
if (L == 0 )
{
result = prefixArray[R];
}
else
{
result = prefixArray[R] -
prefixArray[L - 1 ];
}
if (L % 2 == 1 )
{
result = result * (- 1 );
}
return result;
}
static void findResult( int arr[], int n,
Query q[], int m)
{
int []prefixArray = new int [n];
fillPrefixArray(arr, n, prefixArray);
for ( int i = 0 ; i < m; i++)
{
System.out.print(findResultUtil(
prefixArray, q[i].L,
q[i].R) + " " );
}
}
public static void main(String[] args)
{
int arr[] = { 10 , 13 , 15 , 2 , 45 ,
31 , 22 , 3 , 27 };
int n = arr.length;
Query q[] = { new Query( 2 , 5 ), new Query( 6 , 8 ),
new Query( 1 , 7 ), new Query( 4 , 8 ),
new Query( 0 , 5 )};
int m = q.length;
findResult(arr, n, q, m);
}
}
|
Python3
class Query:
def __init__( self ,l,r):
self .L = l
self .R = r
def fillPrefixArray(arr, n, prefixArray):
prefixArray[ 0 ] = arr[ 0 ]
for i in range ( 1 ,n):
if (i % 2 = = 0 ):
prefixArray[i] = prefixArray[i - 1 ] + arr[i]
else :
prefixArray[i] = prefixArray[i - 1 ] - arr[i]
def findResultUtil(prefixArray, L, R):
if (L = = 0 ):
result = prefixArray[R]
else :
result = prefixArray[R] - prefixArray[L - 1 ]
if (L % 2 = = 1 ):
result = result * ( - 1 )
return result
def findResult(arr, n, q, m):
prefixArray = [ 0 for i in range (n)]
fillPrefixArray(arr, n, prefixArray)
for i in range (m):
print (findResultUtil(prefixArray, q[i].L,q[i].R),end = " " )
arr = [ 10 , 13 , 15 , 2 , 45 , 31 , 22 , 3 , 27 ]
n = len (arr)
q = [ Query( 2 , 5 ), Query( 6 , 8 ), Query( 1 , 7 ), Query( 4 , 8 ), Query( 0 , 5 )]
m = len (q)
findResult(arr, n, q, m)
|
C#
using System;
class GFG{
class Query
{
public int L, R;
public Query( int l, int r)
{
L = l;
R = r;
}
};
static void fillPrefixArray( int []arr, int n,
int []prefixArray)
{
prefixArray[0] = arr[0];
for ( int i = 1; i < n; i++)
{
if (i % 2 == 0)
{
prefixArray[i] = prefixArray[i - 1] +
arr[i];
}
else
{
prefixArray[i] = prefixArray[i - 1] -
arr[i];
}
}
}
static int findResultUtil( int []prefixArray,
int L, int R)
{
int result;
if (L == 0)
{
result = prefixArray[R];
}
else
{
result = prefixArray[R] -
prefixArray[L - 1];
}
if (L % 2 == 1)
{
result = result * (-1);
}
return result;
}
static void findResult( int []arr, int n,
Query []q, int m)
{
int []prefixArray = new int [n];
fillPrefixArray(arr, n, prefixArray);
for ( int i = 0; i < m; i++)
{
Console.Write(findResultUtil(
prefixArray, q[i].L,
q[i].R) + " " );
}
}
public static void Main(String[] args)
{
int []arr = { 10, 13, 15, 2, 45,
31, 22, 3, 27 };
int n = arr.Length;
Query []q = { new Query( 2, 5 ), new Query( 6, 8 ),
new Query( 1, 7 ), new Query( 4, 8 ),
new Query( 0, 5 )};
int m = q.Length;
findResult(arr, n, q, m);
}
}
|
Javascript
<script>
class Query
{
constructor(l, r)
{
this .L = l;
this .R = r;
}
}
function fillPrefixArray(arr, n, prefixArray)
{
prefixArray[0] = arr[0];
for (let i = 1; i < n; i++)
{
if (i % 2 == 0)
{
prefixArray[i] = prefixArray[i - 1] +
arr[i];
}
else
{
prefixArray[i] = prefixArray[i - 1] -
arr[i];
}
}
}
function findResultUtil(prefixArray, L, R)
{
let result;
if (L == 0)
{
result = prefixArray[R];
}
else
{
result = prefixArray[R] -
prefixArray[L - 1];
}
if (L % 2 == 1)
{
result = result * (-1);
}
return result;
}
function findResult(arr, n, q, m)
{
let prefixArray = new Array(n);
fillPrefixArray(arr, n, prefixArray);
for (let i = 0; i < m; i++)
{
document.write(findResultUtil(
prefixArray, q[i].L,
q[i].R) + " " );
}
}
let arr = [ 10, 13, 15, 2, 45,
31, 22, 3, 27 ];
let n = arr.length;
let q = [ new Query(2, 5), new Query(6, 8),
new Query(1, 7), new Query(4, 8),
new Query(0, 5)];
let m = q.length;
findResult(arr, n, q, m);
</script>
|
Output:
27 46 -33 60 24
Time Complexity:O(N + Q)
Auxiliary Space: O(N)
Share your thoughts in the comments
Please Login to comment...