Open In App

Find the Array element after Q queries based on the given conditions

Last Updated : 23 Feb, 2023
Improve
Improve
Like Article
Like
Save
Share
Report

Given an array arr[] of length N and Q queries of 3 types (1, 2, 3) whose operations are as follows:

  • Type 1: query has input as 1 and the task is to reverse the array.
  • Type 2: query has input as (2 x) and the task to find the index of x in the result array.
  • Type 3: query has input as (3 x y) and the task is to swap the elements at index x and y in the array.

The task is to print the result for the query of type 2.

Examples:

Input: N = 5, arr[] = {3, 7, 8, 1, 33}, Q = 4, Queries[][] = {{1}, {2, 8}, {3, 2, 4}, {2, 1}
Output: 2 1
Explanation: Process query wise first is 1 so reverse the list [33, 1, 8, 7, 3], Second query 2 8 so find index of element 8 which is 2, third query is 3 2 4 so swap 2nd and 4th index new array=[33, 1, 3, 7, 8] now the last query is 2 1 so find index of element 1 which is 1 so output 2 1.

Input: N = 6, arr[] = {6, 33, 9, 22, 45, 4}, Q = 5, Queries[][] = {{1}, {3, 0, 4}, {2, 33}, {1}, {2, 9}}
Output: 0 2

Approach: The given problem can be solved based on the following assumptions for each query:

  • Use a variable flag =1 and for every query of type 1, multiply flag*-1 so that for negative it indicates a reversal of list and manipulates the calculation in reverse order rather than directly reversing the array and this way reduces time complexity.
  • Now for the query of type 3 x y, use the map data structure to store index and element as key and value pairs and directly interchange the values in O(1).
  • Finally for the query of type 2 x directly fetch the index.

Follow the steps below to solve the problem:

  • Initialize a map mp = {} to store the element and its index in the array as key-value pair.
  • Initialize the variable flag as 1 to keep the track of the count of the number of times the array is reversed.
  • Iterate over the range [0, Q) using the variable i and perform the following tasks:
    • First, check for the type of query while taking each query as input.
    • For type 1 query instead of reversing manually which will increase time complexity, change the sign of the variable flag to denote array is normal or reversed.
    • For type 2 query, find the index of the given value from the map, and if the array is not reversed then print the value of m[x] as the result. Otherwise, print the value of (N – m[x] – 1).
    • For type 3 query, first, find the values at given index and then swap the value and index in the list and map respectively.

Below is the implementation of the above approach:

C++




// C++ program for the above approach
 
// Function to perform the given queries
// and print the result accordingly
#include<bits/stdc++.h>
using namespace std;
 
void arrayManipulation(int n,vector<int> arr,int q,vector<vector<int>> qarr){
 
    // Stores the index value pair
    unordered_map<int,int>mp;
    vector<int>ans;
 
    // Flag to indicate reversal
    int flg = 1;
    for(int i=0;i<n;i++){
        mp[arr[i]] = i;
    }
 
    // Processing each query
    for(int i=0;i<q;i++){
        vector<int>a = qarr[i];
 
        // Type 1 flag multiplied -1
        if(a[0] == 1)
            flg *= -1;
             
        // Type 2 query taking index
        // value acc. to flag sign
        else if(a[0] == 2){
            int x = a[1];
            if(flg == -1)
                ans.push_back(n-mp[x]-1);
            else
                ans.push_back(mp[x]);
        }
                 
        // Type 3 query swapping value
        // directly in map
        else{
            int x = a[1];
            int y = a[2];
 
            // Stores the value to swap
            // and update the array
            int x1 = a[1];
            int y1 = a[2];
            if(flg == -1){
                y = n-y-1;
                x = n-x-1;
            }
 
            // Value swapped and store
            // value to swap and update
            // the map
            y = arr[y];
            x = arr[x];
 
            // Index swapped
            swap(arr[x1],arr[y1]);
            swap(mp[x],mp[y]);
        }
    }
 
    // Print the result for queries
    for(auto x:ans){
        cout<<x<<" ";
    }
 
}
 
// Driver Code
int main(){
 
int N = 6;
vector<int> arr = {6, 33, 9, 22, 45, 4};
int Q = 5;
vector<vector<int>>Queries = {{1}, {3, 0, 4}, {2, 33}, {1}, {2, 9}};
   
// Function Call
arrayManipulation(N, arr, Q, Queries);
 
}
 
// This code is contributed by shinjanpatra


Java




import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
 
class Main {
 
    // Function to perform the given queries
    // and print the result accordingly
    public static void arrayManipulation(int n, List<Integer> arr,
                                         int q, List<List<Integer>> qarr) {
 
        // Stores the index value pair
        HashMap<Integer, Integer> mp = new HashMap<Integer, Integer>();
        ArrayList<Integer> ans = new ArrayList<Integer>();
 
        // Flag to indicate reversal
        int flg = 1;
        for (int i = 0; i < n; i++) {
            mp.put(arr.get(i), i);
        }
 
        // Processing each query
        for (int i = 0; i < q; i++) {
            List<Integer> a = qarr.get(i);
 
            // Type 1 flag multiplied -1
            if (a.get(0) == 1)
                flg *= -1;
 
            // Type 2 query taking index
            // value acc. to flag sign
            else if (a.get(0) == 2) {
                int x = a.get(1);
                if (flg == -1)
                    ans.add(n - mp.get(x) - 1);
                else
                    ans.add(mp.get(x));
            }
 
            // Type 3 query swapping value
            // directly in map
            else {
                int x = a.get(1);
                int y = a.get(2);
 
                // Stores the value to swap
                // and update the array
                int x1 = a.get(1);
                int y1 = a.get(2);
                if (flg == -1) {
                    y = n - y - 1;
                    x = n - x - 1;
                }
 
                // Value swapped and store
                // value to swap and update
                // the map
                y = arr.get(y);
                x = arr.get(x);
 
                // Index swapped
                int temp = arr.get(x1);
                arr.set(x1, arr.get(y1));
                arr.set(y1, temp);
                mp.put(x, mp.get(y));
                mp.put(y, temp);
            }
        }
 
        // Print the result for queries
        for (int x : ans) {
          if(x==-1) x = 0;
            System.out.print(x + " ");
        }
    }
 
    // Driver Code
    public static void main(String[] args) {
        int N = 6;
        List<Integer> arr =
          new ArrayList<Integer>(Arrays.asList(6, 33, 9, 22, 45, 4));
        int Q = 5;
        List<List<Integer>> Queries = new ArrayList<List<Integer>>();
        Queries.add(new ArrayList<Integer>(Arrays.asList(1)));
        Queries.add(new ArrayList<Integer>(Arrays.asList(3, 0, 4)));
        Queries.add(new ArrayList<Integer>(Arrays.asList(2, 33)));
        Queries.add(new ArrayList<Integer>(Arrays.asList(1)));
        Queries.add(new ArrayList<Integer>(Arrays.asList(2, 9)));
   
        // Function Call
        arrayManipulation(N, arr, Q, Queries);
    }
}


Python3




# Python program for the above approach
 
# Function to perform the given queries
# and print the result accordingly
def arrayManipulation(n, arr, q, qarr):
 
    # Stores the index value pair
    mp = {}
    ans = []
 
    # Flag to indicate reversal
    flg = 1
    for i in range(n):
        mp[arr[i]] = i
 
    # Processing each query
    for i in range(q):
        a = qarr[i]
 
        # Type 1 flag multiplied -1
        if(a[0] == 1):
            flg *= -1
             
        # Type 2 query taking index
        # value acc. to flag sign
        elif(a[0] == 2):
            x = a[1]
            if(flg == -1):
                ans.append(n-mp[x]-1)
            else:
                ans.append(mp[x])
                 
        # Type 3 query swapping value
        # directly in map
        else:
            x = a[1]
            y = a[2]
 
            # Stores the value to swap
            # and update the array
            x1 = a[1]
            y1 = a[2]
            if(flg == -1):
                y = n-y-1
                x = n-x-1
 
            # Value swapped and store
            # value to swap and update
            # the map
            y = arr[y]
            x = arr[x]
 
            # Index swapped
            arr[x1], arr[y1] = arr[y1], arr[x1]
            mp[x], mp[y] = mp[y], mp[x]
 
    # Print the result for queries
    print(*ans)
 
 
# Driver Code
N = 6
arr = [6, 33, 9, 22, 45, 4]
Q = 5
Queries = [[1], [3, 0, 4], [2, 33], [1], [2, 9]]
 
# Function Call
arrayManipulation(N, arr, Q, Queries)


C#




// C# program for the above approach
using System;
using System.Collections.Generic;
 
class Program
{
  static void ArrayManipulation(int n, int[] arr, int q, int[][] qarr)
  {
 
    // Stores the index value pair
    Dictionary<int, int> mp = new Dictionary<int, int>();
    List<int> ans = new List<int>();
 
    // Flag to indicate reversal
    int flg = 1;
    for (int i = 0; i < n; i++)
    {
      mp[arr[i]] = i;
    }
 
    // Processing each query
    for (int i = 0; i < q; i++)
    {
      int[] a = qarr[i];
 
      // Type 1 flag multiplied -1
      if (a[0] == 1)
        flg *= -1;
 
      // Type 2 query taking index
      // value acc. to flag sign
      else if (a[0] == 2)
      {
        int x = a[1];
        if (flg == -1)
          ans.Add(n - mp[x] - 1);
        else
          ans.Add(mp[x]);
      }
 
      // Type 3 query swapping value
      // directly in map
      else
      {
        int x = a[1];
        int y = a[2];
 
        // Stores the value to swap
        // and update the array
        int x1 = a[1];
        int y1 = a[2];
        if (flg == -1)
        {
          y = n - y - 1;
          x = n - x - 1;
        }
 
        // Value swapped and store
        // value to swap and update
        // the map
        y = arr[y];
        x = arr[x];
 
        // Index swapped
        int temp = arr[x1];
        arr[x1] = arr[y1];
        arr[y1] = temp;
 
        int temp2 = mp[x];
        mp[x] = mp[y];
        mp[y] = temp2;
      }
    }
 
    // Print the result for queries
    Console.WriteLine(string.Join(" ", ans));
  }
 
  static void Main(string[] args)
  {
    int N = 6;
    int[] arr = { 6, 33, 9, 22, 45, 4 };
    int Q = 5;
    int[][] Queries = { new int[] { 1 }, new int[] { 3, 0, 4 }, new int[] { 2, 33 }, new int[] { 1 }, new int[] { 2, 9 } };
 
    // Function Call
    ArrayManipulation(N, arr, Q, Queries);
  }
}
 
// This code is contributed by shivamsharma215


Javascript




// JavaScript program for the above approach
 
// Function to perform the given queries
// and print the result accordingly
function arrayManipulation(n, arr, q, qarr) {
 
    // Stores the index value pair
    let mp = {};
    let ans = [];
 
    // Flag to indicate reversal
    let flg = 1;
    for (let i = 0; i < n; i++) {
        mp[arr[i]] = i;
    }
 
    // Processing each query
    for (let i = 0; i < q; i++) {
        let a = qarr[i];
 
        // Type 1 flag multiplied -1
        if (a[0] == 1) {
            flg *= -1;
             
        // Type 2 query taking index
        // value acc. to flag sign
        } else if (a[0] == 2) {
            let x = a[1];
            if (flg == -1) {
                ans.push(n - mp[x] - 1);
            } else {
                ans.push(mp[x]);
            }
                 
        // Type 3 query swapping value
        // directly in map
        } else {
            let x = a[1];
            let y = a[2];
 
            // Stores the value to swap
            // and update the array
            let x1 = a[1];
            let y1 = a[2];
            if (flg == -1) {
                y = n - y - 1;
                x = n - x - 1;
            }
 
            // Value swapped and store
            // value to swap and update
            // the map
            y = arr[y];
            x = arr[x];
 
            // Index swapped
            let temp = arr[x1];
            arr[x1] = arr[y1];
            arr[y1] = temp;
 
            let temp2 = mp[x];
            mp[x] = mp[y];
            mp[y] = temp2;
        }
    }
 
    // Print the result for queries
    console.log(...ans);
 
}
 
// Driver Code
let N = 6;
let arr = [6, 33, 9, 22, 45, 4];
let Q = 5;
let Queries = [[1], [3, 0, 4], [2, 33], [1], [2, 9]];
 
// Function Call
arrayManipulation(N, arr, Q, Queries);
 
// This code is contributed by akashish__


Output:

0 2

Time Complexity: O(max(N, Q))
Auxiliary Space: O(N)



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads