Consultas para actualizar la array agregando o multiplicando elementos de la array e imprimir el elemento presente en el índice especificado

Dada una array arr[] que consta de N enteros y una array Q[] de M pares que representan una consulta de tipo {X, Y} , la tarea es realizar consultas del siguiente tipo:

  • Consulta (0, X): agregue el número entero X a todos los elementos de la array.
  • Query(1, Y): multiplica cada elemento de la array por Y .
  • Query(2, i): Imprime el valor en el índice i .

Ejemplos:

Entrada: arr[] = {5, 1, 2, 3, 9}, Q[][] = {{0, 5}, {2, 4}, {1, 4}, {0, 2}, { 2, 3}}
Salida: 14 34
Explicación:
A continuación se muestran los resultados después de realizar cada consulta:

  1. Consulta (0, 5): al agregar 5 a cada elemento de la array, se modifica la array como arr[] = {10, 6, 7, 8, 14}.
  2. Query(2, 4): imprime el elemento de la array en el índice 4, es decir, arr[4] = 14.
  3. Consulta (1, 4): al multiplicar todos los elementos de la array por 4, se modifica la array como arr[] = {40, 24, 28, 32, 56}
  4. Consulta (0, 2): agregando 2 a cada elemento de la array, modifica la array como arr [] = {42, 26, 30, 34, 58}
  5. Query(2, 3): Imprime el elemento en el índice 4, es decir, arr[3] = 34.

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

Enfoque ingenuo: el enfoque más simple para resolver el problema dado es realizar cada consulta recorriendo la array dada e imprimir el resultado correspondiente para cada consulta.

Complejidad de Tiempo: O(N * M)
Espacio Auxiliar: O(1)

Enfoque eficiente: el enfoque anterior se puede optimizar en función de las siguientes observaciones:

  • Supongamos que A es un elemento y se realiza la siguiente operación:
    • Sumando a1 a A , entonces el valor de A se convierte en A = A + a1 .
    • Multiplique A por b1 , luego el valor de A se convierte en A = b1 * A + b1 * a1 .
    • Agregue a2 a A , luego el valor de A se convierte en A = b1 * A + b1 * a1 + a2 .
    • Multiplique A por b2 , luego el valor de A se convierte en A = b1 * b2 * A + b1 * b2 * a1 + a2 * b2
  • Supongamos que Mul es la multiplicación de todos los enteros de la consulta de tipo 1 y Add almacena el valor de todas las consultas de tipo 0 , y el tipo 1 realizado en el orden dado a partir de 0 . Entonces se puede observar desde arriba que cualquier elemento de array arr[i] se modifica a (arr[i] * Mul + Add) .

Siga los pasos a continuación para resolver el problema:

  • Inicializa dos variables, digamos Mul como 1 y Add como 0, almacena la multiplicación de todos los enteros en la consulta de tipo 2 y almacena el valor obtenido después de realizar la consulta de tipo 1 y 2 en el orden dado en un número 0 .
  • Recorra la array dada de consultas Q[][2] y realice los siguientes pasos:
    • Si Q[i][0] es 0 , incremente el valor de Agregar en Q[i][1] .
    • De lo contrario, si el valor de Q[i][0] es 1 , multiplique Mul y Add por Q[i][1] .
    • De lo contrario, imprima el valor (arr[Q[i][1]] * Mul + Add) como resultado de la consulta de tipo 2 .

A continuación se muestra la implementación del enfoque anterior:

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>
 
 
    
Producción: 

100 1050

 

Complejidad Temporal: O(M)
Espacio Auxiliar: O(1), ya que no se ha tomado ningún espacio extra.

Publicación traducida automáticamente

Artículo escrito por himanshu77 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *