Given an array, arr[] of N positive integers and M queries of the form {a, b, val, f}. The task is to print the array after performing each query to increment array elements in the range [a, b] by a value val f number of times.
Examples:
Input: arr[] = {1, 2, 3}, M=3, Q[][] = {{1, 2, 1, 4}, {1, 3, 2, 3}, {2, 3, 4, 5}}
Output: 11 32 29
Explanation:Â
After applying 1st Query 4 times,Â
Array will be: 5 6 3
After applying 2nd Query 3 times,Â
Array will be: 11 12 9
After applying 3rd Query 5 times,Â
Array will be: 11 32 29
Therefore, the final array will be {11, 32, 29}.Input: arr[] = {1}, M = 1, Q[][] = {{1, 1, 1, 1}}
Output: 2
Explanation:Â
After applying 1st and the only query 1 time only.
Array will be: 2
Naive Approach: The simplest approach is to perform each query on the given array i.e., for each query {a, b, val, f} traverse the array over the range [a, b] and increase each element by value val to f number of times. Print the array after performing each query.
Time Complexity: O(N * M * max(Freq))
Auxiliary Space: O(1)
Better Approach: The idea is based on the difference array which can be used in Range Update operations. Below are the steps:
- Find the difference array D[] of a given array A[] is defined as D[i] = (A[i] – A[i – 1]) (0 < i < N) and D[0] = A[0] considering 0 based indexing.
- Add val to D[a – 1] and subtract it from D[(b – 1) + 1], i.e., D[a – 1] += val, D[(b – 1) + 1] -= val. Perform this operation Freq number of times.
- Now update the given array using the difference array. Update A[0] to D[0] and print it. For rest of the elements, do A[i] = A[i-1] + D[i].
- Print the resultant array after the above steps.
Time Complexity: O(N + M * max(Freq))
Auxiliary Space: O(N) Extra space for Difference Array
Efficient Approach:Â This approach is similar to the previous approach but an extended version of the application of a difference array. Previously the task was to update values from indices a to b by val, f number of times. Here instead of calling the range update function f number of times, call it only once for each query:
- Update values from indices a to b by val*f, only 1 time for each query.
- Add val*f to D[a – 1] and subtract it from D[(b – 1) + 1], i.e., increase D[a – 1] by val*f, and decrease D[b] by val*f.
- Now update the main array using the difference array. Update A[0] to D[0] and print it.
- For rest of the elements, Update A[i] by (A[i-1] + D[i]).
- Print the resultant array after the above steps.
Below is the implementation of the above approach:Â
C++
// C++ program for the above approach Â
#include <bits/stdc++.h> using namespace std; Â
// Function that creates a difference // array D[] for A[] vector< int > initializeDiffArray( Â Â Â Â vector< int >& A) { Â Â Â Â int N = A.size(); Â
    // Stores the difference array     vector< int > D(N + 1); Â
    D[0] = A[0], D[N] = 0; Â
    // Update difference array D[]     for ( int i = 1; i < N; i++)         D[i] = A[i] - A[i - 1]; Â
    // Return difference array     return D; } Â
// Function that performs the range // update queries void update(vector< int >& D, int l,             int r, int x) {     // Update the ends of the range     D[l] += x;     D[r + 1] -= x; } Â
// Function that perform all query // once with modified update Call void UpdateDiffArray(vector< int >& DiffArray,                      int Start, int End,                      int Val, int Freq) {     // For range update, difference     // array is modified     update(DiffArray, Start - 1,            End - 1, Val * Freq); } Â
// Function to take queries void queriesInput(vector< int >& DiffArray,                   int Q[][4], int M) {     // Traverse the query     for ( int i = 0; i < M; i++) { Â
        // Function Call for updates         UpdateDiffArray(DiffArray, Q[i][0],                         Q[i][1], Q[i][2],                         Q[i][3]);     } } Â
// Function to updates the array // using the difference array void UpdateArray(vector< int >& A, Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â vector< int >& D) { Â Â Â Â // Traverse the array A[] Â Â Â Â for ( int i = 0; i < A.size(); i++) { Â
        // 1st Element         if (i == 0) {             A[i] = D[i];         } Â
        // A[0] or D[0] decides values         // of rest of the elements         else {             A[i] = D[i] + A[i - 1];         }     } } Â
// Function that prints the array void PrintArray(vector< int >& A) {     // Print the element     for ( int i = 0; i < A.size(); i++) {         cout << A[i] << " " ;     } Â
    return ; } Â
// Function that print the array // after performing all queries void printAfterUpdate(vector< int >& A,                       int Q[][4], int M) {     // Create and fill difference     // array for range updates     vector< int > DiffArray         = initializeDiffArray(A); Â
    queriesInput(DiffArray, Q, M); Â
    // Now update Array A using     // Difference Array     UpdateArray(A, DiffArray); Â
    // Print updated Array A     // after M queries     PrintArray(A); } Â
// Driver Code int main() {     // N = Array size, M = Queries     int N = 3, M = 3; Â
    // Given array A[]     vector< int > A{ 1, 2, 3 }; Â
    // Queries     int Q[][4] = { { 1, 2, 1, 4 },                    { 1, 3, 2, 3 },                    { 2, 3, 4, 5 } }; Â
    // Function Call     printAfterUpdate(A, Q, M); Â
    return 0; } |
Java
// Java program for the // above approach import java.util.*; class GFG{ Â Â Â // N = Array size, // M = Queries static int N = 3 , M = 3 ; Â Â Â static int []A = new int [N]; Â
//Stores the difference array static int []D = new int [N + 1 ]; Â Â Â // Function that creates // a difference array D[] // for A[] static void initializeDiffArray() { Â Â D[ 0 ] = A[ 0 ]; Â Â D[N] = 0 ; Â
  // Update difference array D[]   for ( int i = 1 ; i < N; i++)     D[i] = A[i] - A[i - 1 ]; } Â
// Function that performs // the range update queries static void update( int l,                    int r, int x) {   // Update the ends   // of the range   D[l] += x;   D[r + 1 ] -= x; } Â
// Function that perform all query // once with modified update Call static void UpdateDiffArray( int Start, int End,                             int Val, int Freq) {   // For range update, difference   // array is modified   update(Start - 1 ,          End - 1 , Val * Freq); } Â
// Function to take queries static void queriesInput( int Q[][]) {   // Traverse the query   for ( int i = 0 ; i < M; i++)   {     // Function Call for updates     UpdateDiffArray(Q[i][ 0 ], Q[i][ 1 ],                     Q[i][ 2 ], Q[i][ 3 ]);   } } Â
// Function to updates the array // using the difference array static void UpdateArray() {   // Traverse the array A[]   for ( int i = 0 ; i < N; i++)   {     // 1st Element     if (i == 0 )     {       A[i] = D[i];     } Â
    // A[0] or D[0] decides     // values of rest of     // the elements     else     {       A[i] = D[i] + A[i - 1 ];     }   } } Â
// Function that prints // the array static void PrintArray() {   // Print the element   for ( int i = 0 ; i < N; i++)   {     System.out.print(A[i] + i +                      1 + " " );   }   return ; } Â
// Function that print the array // after performing all queries static void printAfterUpdate( int []A,                              int Q[][], int M) {   // Create and fill difference   // array for range updates   initializeDiffArray(); Â
  queriesInput( Q); Â
  // Now update Array   // A using Difference   // Array   UpdateArray(); Â
  // Print updated Array A   // after M queries   PrintArray(); } Â
// Driver Code public static void main(String[] args) { Â Â // Given array A[] Â Â int []A = { 1 , 2 , 3 }; Â
  // Queries   int [][]Q = {{ 1 , 2 , 1 , 4 },                { 1 , 3 , 2 , 3 },                { 2 , 3 , 4 , 5 }}; Â
  // Function Call   printAfterUpdate(A, Q, M); } } Â
// This code is contributed by gauravrajput1 |
Python3
# Python3 program for the above approach Â
# Function that creates a difference # array D[] for A[] def initializeDiffArray(A): Â Â Â Â Â Â Â Â Â N = len (A) Â
    # Stores the difference array     D = [ 0 ] * (N + 1 ) Â
    D[ 0 ] = A[ 0 ]     D[N] = 0 Â
    # Update difference array D[]     for i in range ( 1 , N):         D[i] = A[i] - A[i - 1 ] Â
    # Return difference array     return D Â
# Function that performs the range # update queries def update(D, l, r, x):          # Update the ends of the range     D[l] + = x     D[r + 1 ] - = x Â
# Function that perform all query # once with modified update Call def UpdateDiffArray(DiffArray, Start,                     End, Val, Freq):                              # For range update, difference     # array is modified     update(DiffArray, Start - 1 ,            End - 1 , Val * Freq) Â
# Function to take queries def queriesInput(DiffArray, Q, M):          # Traverse the query     for i in range (M): Â
        # Function Call for updates         UpdateDiffArray(DiffArray, Q[i][ 0 ],                           Q[i][ 1 ], Q[i][ 2 ],                           Q[i][ 3 ]) Â
# Function to updates the array # using the difference array def UpdateArray(A, D): Â Â Â Â Â Â Â Â Â # Traverse the array A[] Â Â Â Â for i in range ( len (A)): Â
        # 1st Element         if (i = = 0 ):             A[i] = D[i] Â
        # A[0] or D[0] decides values         # of rest of the elements         else :             A[i] = D[i] + A[i - 1 ] Â
# Function that prints the array def PrintArray(A):          # Print the element     for i in range ( len (A)):         print (A[i], end = " " )              return Â
# Function that print the array # after performing all queries def printAfterUpdate(A, Q, M):          # Create and fill difference     # array for range updates     DiffArray = initializeDiffArray(A) Â
    queriesInput(DiffArray, Q, M) Â
    # Now update Array A using     # Difference Array     UpdateArray(A, DiffArray) Â
    # Print updated Array A     # after M queries     PrintArray(A) Â
# Driver Code if __name__ = = '__main__' :          # N = Array size, M = Queries     N = 3     M = 3 Â
    # Given array A[]     A = [ 1 , 2 , 3 ] Â
    # Queries     Q = [ [ 1 , 2 , 1 , 4 ],           [ 1 , 3 , 2 , 3 ],           [ 2 , 3 , 4 , 5 ] ] Â
    # Function call     printAfterUpdate(A, Q, M) Â
# This code is contributed by mohit kumar 29 |
C#
// C# program for the // above approach using System; class GFG{ Â
// N = Array size, // M = Queries static int N = 3, M = 3; Â
static int [] A = new int [N]; Â
// Stores the difference array static int [] D = new int [N + 1]; Â
// Function that creates // a difference array D[] // for A[] static void initializeDiffArray() { Â Â D[0] = A[0]; Â Â D[N] = 0; Â
  // Update difference array D[]   for ( int i = 1; i < N; i++)     D[i] = A[i] - A[i - 1]; } Â
// Function that performs // the range update queries static void update( int l,                    int r, int x) {   // Update the ends   // of the range   D[l] += x;   D[r + 1] -= x; } Â
// Function that perform all query // once with modified update Call static void UpdateDiffArray( int Start, int End,                             int Val, int Freq) {   // For range update, difference   // array is modified   update(Start - 1,          End - 1, Val * Freq); } Â
// Function to take queries static void queriesInput( int [, ] Q) {   // Traverse the query   for ( int i = 0; i < M; i++)   {     // Function Call for updates     UpdateDiffArray(Q[i, 0], Q[i, 1],                     Q[i, 2], Q[i, 3]);   } } Â
// Function to updates the array // using the difference array static void UpdateArray() {   // Traverse the array A[]   for ( int i = 0; i < N; i++)   {     // 1st Element     if (i == 0)     {       A[i] = D[i];     } Â
    // A[0] or D[0] decides     // values of rest of     // the elements     else     {       A[i] = D[i] + A[i - 1];     }   } } Â
// Function that prints // the array static void PrintArray() {   // Print the element   for ( int i = 0; i < N; i++)   {     Console.Write(A[i] + i +                   1 + " " );   }   return ; } Â
// Function that print the array // after performing all queries static void printAfterUpdate( int [] A,                              int [, ] Q, int M) {   // Create and fill difference   // array for range updates   initializeDiffArray(); Â
  queriesInput(Q); Â
  // Now update Array   // A using Difference   // Array   UpdateArray(); Â
  // Print updated Array A   // after M queries   PrintArray(); } Â
// Driver Code public static void Main(String[] args) { Â Â // Given array A[] Â Â int [] A = {1, 2, 3}; Â
  // Queries   int [, ] Q = {{1, 2, 1, 4},                {1, 3, 2, 3},                {2, 3, 4, 5}}; Â
  // Function Call   printAfterUpdate(A, Q, M); } Â
// This code is contributed by Chitranayal |
Javascript
<script> Â
// Javascript program to implement // the above approach Â
// N = Array size, // M = Queries let N = 3, M = 3; Â Â Â let A = new Array(N).fill(0); Â
//Stores the difference array let D = new Array(N+1).fill(0); Â Â Â // Function that creates // a difference array D[] // for A[] function initializeDiffArray() { Â Â D[0] = A[0]; Â Â D[N] = 0; Â
  // Update difference array D[]   for (let i = 1; i < N; i++)     D[i] = A[i] - A[i - 1]; } Â
// Function that performs // the range update queries function update(l, r, x) {   // Update the ends   // of the range   D[l] += x;   D[r + 1] -= x; } Â
// Function that perform all query // once with modified update Call function UpdateDiffArray(Start, End, Val, Freq) {   // For range update, difference   // array is modified   update(Start - 1,          End - 1, Val * Freq); } Â
// Function to take queries function queriesInput(Q) {   // Traverse the query   for (let i = 0; i < M; i++)   {     // Function Call for updates     UpdateDiffArray(Q[i][0], Q[i][1],                     Q[i][2], Q[i][3]);   } } Â
// Function to updates the array // using the difference array function UpdateArray() {   // Traverse the array A[]   for (let i = 0; i < N; i++)   {     // 1st Element     if (i == 0)     {       A[i] = D[i];     } Â
    // A[0] or D[0] decides     // values of rest of     // the elements     else     {       A[i] = D[i] + A[i - 1];     }   } } Â
// Function that print // the array function PrintArray() {   // Print the element   for (let i = 0; i < N; i++)   {     document.write(A[i] + i +                      1 + " " );   }   return ; } Â
// Function that print the array // after performing all queries function printAfterUpdate(A, Q, M) {   // Create and fill difference   // array for range updates   initializeDiffArray(); Â
  queriesInput( Q); Â
  // Now update Array   // A using Difference   // Array   UpdateArray(); Â
  // Print updated Array A   // after M queries   PrintArray(); } Â
// Driver Code Â
       // Given array A[]   let a = [1, 2, 3]; Â
  // Queries   let Q = [[1, 2, 1, 4],                [1, 3, 2, 3],                [2, 3, 4, 5]]; Â
  // Function Call   printAfterUpdate(a, Q, M);           </script> |
11 32 29
Time Complexity: O(N + M)
Auxiliary Space: O(N)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!