Given an array of size ‘n’ and a given set of commands of size ‘m’. Every command consist of four integers q, l, r, k. These commands are of following types:
- If q = 0, add ‘k’ to all integers in range ‘a’ to ‘b'(1 <= a <= b <= n).
- If q = 1, subtract ‘k’ to all integers in range ‘a’ to ‘b'(1 <= a <= b <= n).
Note: Initially all the array elements are set to ‘0’ and array indexing is from ‘1’.
Input : n = 5
commands[] = {{0 1 3 2}, {1 3 5 3},
{0 2 5 1}}
Output : 0 2 -1 -1 -3
Explanation
First command: Add 2 from index 1 to 3
>= 2 2 2 0 0
Second command: Subtract 3 from index 3 to 5
>= 2 2 -1 -3 -3
Third command: Add 1 from index 2 to 5
>= 2 3 0 -2 -2
Simple approach is to execute every command by iterating from left index(l) up-to the right index(r) and update every index according to given command. Time complexity of this approach is O(n*m)
Better approach is to use Fenwick tree(BIT) or segment tree. But it will only optimize upto log(n) time i.e., overall complexity would become O(m*log(n))
Efficient approach is to use simple mathematics. Since all commands can be handled as offline so we can store all updates in our temporary array and then execute it at the last.
- For command ‘0‘, add ‘+k‘ and ‘-k‘ in lth and (r+1)th index elements respectively.
- For command ‘1‘, add ‘-k‘ and ‘+k‘ in the lth and (r+1)th index elements respectively.
After that sum up all the elements for every index ‘i‘ starting from 1st index i.e., ai will contain the sum of all elements from 1 to ith index. This can easily be achieved with the help of dynamic programming.
Implementation:
C++
#include<bits/stdc++.h>
using namespace std;
void updateQuery( int arr[], int n, int q, int l,
int r, int k)
{
if (q == 0){
arr[l-1] += k;
arr[r] += -k;
}
else {
arr[l-1] += -k;
arr[r] += k;
}
return ;
}
void generateArray( int arr[], int n)
{
for ( int i = 1; i < n; ++i)
arr[i] += arr[i-1];
return ;
}
int main()
{
int n = 5;
int arr[n+1];
memset (arr, 0, sizeof (arr));
int q = 0, l = 1, r = 3, k = 2;
updateQuery(arr, n, q, l, r, k);
q = 1 , l = 3, r = 5, k = 3;
updateQuery(arr, n, q, l, r, k);
q = 0 , l = 2, r = 5, k = 1;
updateQuery(arr, n, q, l, r, k);
generateArray(arr, n);
for ( int i = 0; i < n; ++i)
cout << arr[i] << " " ;
return 0;
}
|
Java
import java.util.Arrays;
class GFG {
static void updateQuery( int arr[], int n,
int q, int l, int r, int k)
{
if (q == 0 ){
arr[l- 1 ] += k;
arr[r] += -k;
}
else {
arr[l- 1 ] += -k;
arr[r] += k;
}
return ;
}
static void generateArray( int arr[], int n)
{
for ( int i = 1 ; i < n; ++i)
arr[i] += arr[i- 1 ];
}
public static void main(String arg[])
{
int n = 5 ;
int arr[] = new int [n+ 1 ];
Arrays.fill(arr, 0 );
int q = 0 , l = 1 , r = 3 , k = 2 ;
updateQuery(arr, n, q, l, r, k);
q = 1 ; l = 3 ; r = 5 ; k = 3 ;
updateQuery(arr, n, q, l, r, k);
q = 0 ; l = 2 ; r = 5 ; k = 1 ;
updateQuery(arr, n, q, l, r, k);
generateArray(arr, n);
for ( int i = 0 ; i < n; ++i)
System.out.print(arr[i]+ " " );
}
}
|
Python3
def updateQuery(arr, n, q, l, r, k):
if (q = = 0 ):
arr[l - 1 ] + = k
arr[r] + = - k
else :
arr[l - 1 ] + = - k
arr[r] + = k
return
def generateArray(arr, n):
for i in range ( 1 , n):
arr[i] + = arr[i - 1 ]
return
n = 5
arr = [ 0 for i in range (n + 1 )]
q = 0 ; l = 1 ; r = 3 ; k = 2
updateQuery(arr, n, q, l, r, k)
q, l, r, k = 1 , 3 , 5 , 3
updateQuery(arr, n, q, l, r, k);
q, l, r, k = 0 , 2 , 5 , 1
updateQuery(arr, n, q, l, r, k)
generateArray(arr, n)
for i in range (n):
print (arr[i], end = " " )
|
C#
using System;
class GFG {
static void updateQuery( int [] arr, int n, int q,
int l, int r, int k)
{
if (q == 0) {
arr[l - 1] += k;
arr[r] += -k;
}
else {
arr[l - 1] += -k;
arr[r] += k;
}
return ;
}
static void generateArray( int [] arr, int n)
{
for ( int i = 1; i < n; ++i)
arr[i] += arr[i - 1];
}
public static void Main()
{
int n = 5;
int [] arr = new int [n + 1];
for ( int i = 0; i < arr.Length; i++)
arr[i] = 0;
int q = 0, l = 1, r = 3, k = 2;
updateQuery(arr, n, q, l, r, k);
q = 1;
l = 3;
r = 5;
k = 3;
updateQuery(arr, n, q, l, r, k);
q = 0;
l = 2;
r = 5;
k = 1;
updateQuery(arr, n, q, l, r, k);
generateArray(arr, n);
for ( int i = 0; i < n; ++i)
Console.Write(arr[i] + " " );
}
}
|
Javascript
<script>
function updateQuery(arr , n , q , l , r , k) {
if (q == 0) {
arr[l - 1] += k;
arr[r] += -k;
}
else {
arr[l - 1] += -k;
arr[r] += k;
}
return ;
}
function generateArray(arr, n)
{
for (i = 1; i < n; ++i)
arr[i] += arr[i - 1];
}
var n = 5;
var arr = Array(n + 1).fill(0);
var q = 0, l = 1, r = 3, k = 2;
updateQuery(arr, n, q, l, r, k);
q = 1;
l = 3;
r = 5;
k = 3;
updateQuery(arr, n, q, l, r, k);
q = 0;
l = 2;
r = 5;
k = 1;
updateQuery(arr, n, q, l, r, k);
generateArray(arr, n);
for (i = 0; i < n; i++)
document.write(arr[i] + " " );
</script>
|
Time complexity: O(Max(m,n))
Auxiliary space: O(n)
This article is contributed by Shubham Bansal. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.