Open In App

Queries to update array by adding or multiplying array elements and print the element present at specified index

Improve
Improve
Like Article
Like
Save
Share
Report

Given an array arr[] consisting of N integers and an array Q[] of M pairs representing a query of type {X, Y}, the task is to perform queries of the following type:

  • Query(0, X): Add integer X to every array elements.
  • Query(1, Y): Multiply each array element by Y.
  • Query(2, i): Print the value at index i.

Examples:

Input: arr[] = {5, 1, 2, 3, 9}, Q[][] = {{0, 5}, {2, 4}, {1, 4}, {0, 2}, {2, 3}}
Output: 14 34
Explanation:
Below are the results after performing each query:

  1. Query(0, 5): Adding 5 to every array elements, modifies the array as arr[] = {10, 6, 7, 8, 14}.
  2. Query(2, 4): Print the array element at index 4, i.e., arr[4] = 14.
  3. Query(1, 4): Multiplying every array elements with 4, modifies the array as arr[] = {40, 24, 28, 32, 56}
  4. Query(0, 2): Adding 2 to every array elements, modifies the array as arr[] = {42, 26, 30, 34, 58}
  5. Query(2, 3): Print the element at index 4, i.e., arr[3] = 34.

Input: arr[] = {3, 1, 23, 45, 100}, Q[][] = {{1, 2}, {0, 10}, {2, 3}, {1, 5}, {2, 4}}
Output: 100 1050

Naive Approach: The simplest approach is to solve the given problem is to perform each query by traversing the given array and print the result accordingly for each query.

Time Complexity: O(N * M)
Auxiliary Space: O(1)

Efficient Approach: The above approach can be optimized based on the following observations:

  • Suppose A is an element and the following operation is performed:
    • Adding a1 to A, then the value of A becomes A = A + a1.
    • Multiply A by b1, then the value of A becomes A = b1 * A + b1 * a1.
    • Add a2 to A, then the value of A becomes A = b1 * A + b1 * a1 + a2.
    • Multiply A by b2, then the value of A becomes, A = b1 * b2 * A + b1 * b2 * a1 + a2 * b2
  • Suppose Mul is the multiplication of all the integers of the query of type 1 and Add stores the value of all the query of type 0, and type 1 performed in the given order starting as 0. Then it can be observed from above that any array element arr[i] modifies to (arr[i] * Mul + Add).

Follow the steps below to solve the problem:

  • Initialize two variables, say Mul as 1 and Add as 0, stores the multiplication of all the integers in the query of type 2 and stores the value got after performing the query of type 1 and 2 in the given order on a number 0.
  • Traverse the given array of queries Q[][2] and perform the following steps:
    • If Q[i][0] is 0, then increment the value of Add by Q[i][1].
    • Otherwise, if the value of Q[i][0] is 1 then multiply Mul and Add by Q[i][1].
    • Otherwise, print the value (arr[Q[i][1]] * Mul + Add) as the result for the query of type 2.

Below is the implementation of the above approach:

C++




// C++ program for the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to modify the array
// by performing given queries
void Query(int arr[], int N,
           vector<vector<int> > Q)
{
    // Stores the multiplication
    // of all integers of type 1
    int mul = 1;
 
    // Stores the value obtained after
    // performing queries of type 1 & 2
    int add = 0;
 
    // Iterate over the queries
    for (int i = 0; i < Q.size(); i++) {
 
        // Query of type 0
        if (Q[i][0] == 0) {
 
            // Update the value of add
            add = add + Q[i][1];
        }
 
        // Query of type 1
        else if (Q[i][0] == 1) {
 
            // Update the value of mul
            mul = mul * Q[i][1];
 
            // Update the value of add
            add = add * Q[i][1];
        }
 
        // Otherwise
        else {
 
            // Store the element at index Q[i][1]
            int ans = arr[Q[i][1]] * mul + add;
 
            // Print the result for
            // the current query
            cout << ans << " ";
        }
    }
}
 
// Driver Code
int main()
{
    int arr[] = { 3, 1, 23, 45, 100 };
    int N = sizeof(arr) / sizeof(arr[0]);
 
    vector<vector<int> > Q = {
        { 1, 2 }, { 0, 10 },
        { 2, 3 }, { 1, 5 }, { 2, 4 }
    };
    Query(arr, N, Q);
 
    return 0;
}


Java




// Java program for the above approach
import java.io.*;
import java.lang.*;
import java.util.*;
 
public class GFG
{
 
    // Function to modify the array
    // by performing given queries
    static void Query(int arr[], int N, int Q[][])
    {
       
        // Stores the multiplication
        // of all integers of type 1
        int mul = 1;
 
        // Stores the value obtained after
        // performing queries of type 1 & 2
        int add = 0;
 
        // Iterate over the queries
        for (int i = 0; i < Q.length; i++) {
 
            // Query of type 0
            if (Q[i][0] == 0) {
 
                // Update the value of add
                add = add + Q[i][1];
            }
 
            // Query of type 1
            else if (Q[i][0] == 1) {
 
                // Update the value of mul
                mul = mul * Q[i][1];
 
                // Update the value of add
                add = add * Q[i][1];
            }
 
            // Otherwise
            else {
 
                // Store the element at index Q[i][1]
                int ans = arr[Q[i][1]] * mul + add;
 
                // Print the result for
                // the current query
                System.out.print(ans + " ");
            }
        }
    }
 
    // Driver Code
    public static void main(String[] args)
    {
 
        int arr[] = { 3, 1, 23, 45, 100 };
        int N = arr.length;
 
        int Q[][] = { { 1, 2 },
                      { 0, 10 },
                      { 2, 3 },
                      { 1, 5 },
                      { 2, 4 } };
        Query(arr, N, Q);
    }
}
 
// This code is contributed by Kingash.


Python3




# Python3 program for the above approach
 
# Function to modify the array
# by performing given queries
def Query(arr, N, Q):
   
    # Stores the multiplication
    # of all integers of type 1
    mul = 1
 
    # Stores the value obtained after
    # performing queries of type 1 & 2
    add = 0
 
    # Iterate over the queries
    for i in range(len(Q)):
       
        # Query of type 0
        if (Q[i][0] == 0):
           
            # Update the value of add
            add = add + Q[i][1]
             
        # Query of type 1
        elif (Q[i][0] == 1):
 
            # Update the value of mul
            mul = mul * Q[i][1]
 
            # Update the value of add
            add = add * Q[i][1]
        # Otherwise
        else:
 
            # Store the element at index Q[i][1]
            ans = arr[Q[i][1]] * mul + add
 
            # Print result for
            # the current query
            print(ans,end=" ")
 
# Driver Code
if __name__ == '__main__':
 
    arr = [3, 1, 23, 45, 100]
    N = len(arr)
    Q = [
        [ 1, 2 ], [ 0, 10 ],
        [ 2, 3 ], [ 1, 5 ], [ 2, 4 ]
    ]
    Query(arr, N, Q)
 
# This code is contributed by mohit kumar 29.


C#




// C# program for the above approach
using System;
class GFG {
 
  // Function to modify the array
  // by performing given queries
  static void Query(int[] arr, int N, int[, ] Q)
  {
    // Stores the multiplication
    // of all integers of type 1
    int mul = 1;
 
    // Stores the value obtained after
    // performing queries of type 1 & 2
    int add = 0;
 
    // Iterate over the queries
    for (int i = 0; i < Q.GetLength(0); i++) {
 
      // Query of type 0
      if (Q[i, 0] == 0) {
 
        // Update the value of add
        add = add + Q[i, 1];
      }
 
      // Query of type 1
      else if (Q[i, 0] == 1) {
 
        // Update the value of mul
        mul = mul * Q[i, 1];
 
        // Update the value of add
        add = add * Q[i, 1];
      }
 
      // Otherwise
      else {
 
        // Store the element at index Q[i][1]
        int ans = arr[Q[i, 1]] * mul + add;
 
        // Print the result for
        // the current query
        Console.Write(ans + " ");
      }
    }
  }
 
  // Driver Code
  public static void Main()
  {
    int[] arr = { 3, 1, 23, 45, 100 };
    int N = arr.Length;
 
    int[, ] Q = { { 1, 2 },
                 { 0, 10 },
                 { 2, 3 },
                 { 1, 5 },
                 { 2, 4 } };
    Query(arr, N, Q);
  }
}
 
// This code is contributed by ukasp.


Javascript




<script>
// Javascript implementation of the above approach
 
    // Function to modify the array
    // by performing given queries
    function Query(arr, N, Q)
    {
       
        // Stores the multiplication
        // of all integers of type 1
        let mul = 1;
 
        // Stores the value obtained after
        // performing queries of type 1 & 2
        let add = 0;
 
        // Iterate over the queries
        for (let i = 0; i < Q.length; i++) {
 
            // Query of type 0
            if (Q[i][0] == 0) {
 
                // Update the value of add
                add = add + Q[i][1];
            }
 
            // Query of type 1
            else if (Q[i][0] == 1) {
 
                // Update the value of mul
                mul = mul * Q[i][1];
 
                // Update the value of add
                add = add * Q[i][1];
            }
 
            // Otherwise
            else {
 
                // Store the element at index Q[i][1]
                let ans = arr[Q[i][1]] * mul + add;
 
                // Print the result for
                // the current query
                document.write(ans + " ");
            }
        }
    }
 
  // Driver Code
     
     let arr = [ 3, 1, 23, 45, 100 ];
        let N = arr.length;
 
        let Q = [[ 1, 2 ],
                      [ 0, 10 ],
                      [ 2, 3 ],
                      [ 1, 5 ],
                      [ 2, 4 ]];
        Query(arr, N, Q);
       
</script>
 
 
    


Output: 

100 1050

 

Time Complexity: O(M)
Auxiliary Space: O(1),  since no extra space has been taken.



Last Updated : 20 Jul, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads