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 queriesvoid 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 Callvoid 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 queriesvoid 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 arrayvoid 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 arrayvoid 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 queriesvoid 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 Codeint 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 approachimport java.util.*;class GFG{Â Â Â // N = Array size, // M = Queriesstatic int N = 3, M = 3;Â Â Â static int []A = new int[N];Â
//Stores the difference arraystatic 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 queriesstatic 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 Callstatic 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 queriesstatic 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 arraystatic 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 arraystatic 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 queriesstatic 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 Codepublic 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 queriesdef 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 Calldef UpdateDiffArray(DiffArray, Start,                    End, Val, Freq):                             # For range update, difference    # array is modified    update(DiffArray, Start - 1,            End - 1, Val * Freq)Â
# Function to take queriesdef 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 arraydef 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 arraydef PrintArray(A):         # Print the element    for i in range(len(A)):        print(A[i], end = " ")             returnÂ
# Function that print the array# after performing all queriesdef 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 Codeif __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 approachusing System;class GFG{Â
// N = Array size,// M = Queriesstatic int N = 3, M = 3;Â
static int[] A = new int[N];Â
// Stores the difference arraystatic 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 queriesstatic 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 Callstatic 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 queriesstatic 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 arraystatic 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 arraystatic 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 queriesstatic 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 Codepublic 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 = Querieslet N = 3, M = 3;Â Â Â let A = new Array(N).fill(0);Â
//Stores the difference arraylet 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 queriesfunction 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 Callfunction UpdateDiffArray(Start, End, Val, Freq){  // For range update, difference  // array is modified  update(Start - 1,         End - 1, Val * Freq);}Â
// Function to take queriesfunction 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 arrayfunction 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 arrayfunction 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 queriesfunction 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!

… [Trackback]
[…] Here you can find 47262 more Information to that Topic: geeksforgeeks.org/queries-to-increment-array-elements-in-a-given-range-by-a-given-value-for-a-given-number-of-times/ […]
… [Trackback]
[…] Information to that Topic: geeksforgeeks.org/queries-to-increment-array-elements-in-a-given-range-by-a-given-value-for-a-given-number-of-times/ […]
… [Trackback]
[…] Read More here to that Topic: geeksforgeeks.org/queries-to-increment-array-elements-in-a-given-range-by-a-given-value-for-a-given-number-of-times/ […]