Queries to update array elements in a range [L, R] to satisfy given conditions
Last Updated :
02 Dec, 2021
Given an array arr[] consisting of N 0s and an array Q[][] with each row of the form (L, R)., the task for each query is to update all the array elements in the range [L, R] such that arr[i] = i – L + 1.
Examples:
Input: arr[] = { 0, 0, 0, 0 }, Q[][] = { { 1, 2 }, { 0, 1 } }
Output: 1 3 2 0
Explanation:
Query1: Updating arr[1] = 1 – 1 + 1, arr[2] = 2 – 1 + 1 modifies arr[] to { 0, 1, 2, 0 }
Query2: Updating arr[0] = 0 – 0 + 1, arr[1] = 1 – 0 + 1 modifies arr[] to { 1, 3, 2, 0 }
Therefore, the required output is 1 3 2 0.
Input: arr[] = { 0, 0, 0, 0 }, Q[][] = { { 1, 3 }, { 0, 1 } }
Output: 1 3 2 3
Naive Approach:The simplest approach to solve the problem is to traverse the array Q[][] and for each query, traverse all the array elements in the given range and update arr[i] += i – L + 1. Finally, print the array elements.
Time Complexity: O(N * Q)
Auxiliary Space: O(1)
Efficient Approach: The above approach can be optimized using the concept of Difference Array. Follow the steps below to solve the problem:
- Initialize two arrays arr1[] and arr2[] and initialize all elements as 0.
- Traverse the query array, Q[][]. For each query of type (L, R) update arr1[L] += 1, arr1[R + 1] -= 1 and arr2[R + 1] -= R – L + 1.
- Traverse the array, arr1[] and store the prefix sum of arr1[], i.e. arr1[i] += arr1[i -1].
- Traverse the array, arr2[] and update arr2[i] += arr2[i – 1] + arr1[i].
- Finally, print the array, arr2[].
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void printArray( int arr[], int N)
{
for ( int i = 0; i < N; i++) {
cout << arr[i] << " " ;
}
}
void modifyArray( int arr[], int N, int Q[][2],
int cntQuery)
{
int arr1[N + 1] = { 0 };
int arr2[N + 1] = { 0 };
for ( int i = 0; i < cntQuery; i++) {
int L = Q[i][0] + 1, R = Q[i][1] + 1;
arr1[L]++;
arr1[R + 1]--;
arr2[R + 1] -= R - L + 1;
}
for ( int i = 1; i <= N; i++)
arr1[i] += arr1[i - 1];
for ( int i = 1; i <= N; i++)
arr2[i] += arr2[i - 1] + arr1[i];
for ( int i = 1; i <= N; i++)
arr[i - 1] = arr2[i];
printArray(arr, N);
}
int main()
{
int arr[] = { 0, 0, 0, 0 };
int N = sizeof (arr) / sizeof (arr[0]);
int Q[][2] = { { 1, 3 }, { 0, 1 } };
int cntQuery
= sizeof (Q) / sizeof (Q[0]);
modifyArray(arr, N, Q, cntQuery);
return 0;
}
|
Java
class GFG
{
static void printArray( int arr[], int N)
{
for ( int i = 0 ; i < N; i++)
{
System.out.print(arr[i] + " " );
}
}
static void modifyArray( int arr[], int N, int Q[][],
int cntQuery)
{
int arr1[] = new int [N + 2 ];
int arr2[] = new int [N + 2 ];
for ( int i = 0 ; i < cntQuery; i++)
{
int L = Q[i][ 0 ] + 1 , R = Q[i][ 1 ] + 1 ;
arr1[L]++;
arr1[R + 1 ]--;
arr2[R + 1 ] -= R - L + 1 ;
}
for ( int i = 1 ; i <= N; i++)
arr1[i] += arr1[i - 1 ];
for ( int i = 1 ; i <= N; i++)
arr2[i] += arr2[i - 1 ] + arr1[i];
for ( int i = 1 ; i <= N; i++)
arr[i - 1 ] = arr2[i];
printArray(arr, N);
}
public static void main (String[] args)
{
int arr[] = { 0 , 0 , 0 , 0 };
int N = arr.length;
int Q[][] = { { 1 , 3 }, { 0 , 1 } };
int cntQuery = Q.length;
modifyArray(arr, N, Q, cntQuery);
}
}
|
Python3
def printArray(arr, N):
print ( * arr)
def modifyArray(arr, N, Q, cntQuery):
arr1 = [ 0 for i in range (N + 2 )]
arr2 = [ 0 for i in range (N + 2 )]
for i in range (cntQuery):
L = Q[i][ 0 ] + 1
R = Q[i][ 1 ] + 1
arr1[L] + = 1
arr1[R + 1 ] - = 1
arr2[R + 1 ] - = R - L + 1
for i in range ( 1 , N + 1 ):
arr1[i] + = arr1[i - 1 ]
for i in range ( 1 , N + 1 ):
arr2[i] + = arr2[i - 1 ] + arr1[i]
for i in range ( 1 , N + 1 ):
arr[i - 1 ] = arr2[i]
printArray(arr, N)
if __name__ = = '__main__' :
arr = [ 0 , 0 , 0 , 0 ]
N = len (arr)
Q = [[ 1 , 3 ], [ 0 , 1 ]]
cntQuery = len (Q)
modifyArray(arr, N, Q, cntQuery)
|
C#
using System;
class GFG
{
static void printArray( int []arr, int N)
{
for ( int i = 0; i < N; i++)
{
Console.Write(arr[i] + " " );
}
}
static void modifyArray( int []arr, int N, int [,] Q,
int cntQuery)
{
int []arr1 = new int [N + 2];
int []arr2 = new int [N + 2];
for ( int i = 0; i < cntQuery; i++)
{
int L = Q[i,0] + 1, R = Q[i,1] + 1;
arr1[L]++;
arr1[R + 1]--;
arr2[R + 1] -= R - L + 1;
}
for ( int i = 1; i <= N; i++)
arr1[i] += arr1[i - 1];
for ( int i = 1; i <= N; i++)
arr2[i] += arr2[i - 1] + arr1[i];
for ( int i = 1; i <= N; i++)
arr[i - 1] = arr2[i];
printArray(arr, N);
}
public static void Main()
{
int []arr = { 0, 0, 0, 0 };
int N = arr.Length;
int [,]Q = { { 1, 3 }, { 0, 1 } };
int cntQuery = 2;
modifyArray(arr, N, Q, cntQuery);
}
}
|
Javascript
<script>
function printArray(arr, N)
{
for (let i = 0; i < N; i++)
{
document.write(arr[i] + " " );
}
}
function modifyArray(arr, N, Q, cntQuery)
{
let arr1 = new Array(N + 2).fill(0);
let arr2 = new Array(N + 2).fill(0);
for (let i = 0; i < cntQuery; i++)
{
let L = Q[i][0] + 1, R = Q[i][1] + 1;
arr1[L]++;
arr1[R + 1]--;
arr2[R + 1] -= R - L + 1;
}
for (let i = 1; i <= N; i++)
arr1[i] += arr1[i - 1];
for (let i = 1; i <= N; i++)
arr2[i] += arr2[i - 1] + arr1[i];
for (let i = 1; i <= N; i++)
arr[i - 1] = arr2[i];
prletArray(arr, N);
}
let arr = [ 0, 0, 0, 0 ];
let N = arr.length;
let Q = [ [ 1, 3 ], [ 0, 1 ] ];
let cntQuery = Q.length;
modifyArray(arr, N, Q, cntQuery);
</script>
|
Time Complexity: O(N+Q)
Auxiliary Space: O(N)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...