Construct a List using XOR queries (original) (raw)

Last Updated : 15 Jun, 2026

Given a list s that initially contains a single value **0. Below are the q queries of the following types:

The task is to print all the element in the list in increasing order after performing the given **Q queries.

**Examples:

**Input: queries[][] = [{0, 6}, {0, 3}, {0, 2}, {1, 4}, {1, 5} ]
**Output: 1 2 3 7
**Explanation: [0] (initial value) , [0 6] (add 6 to list), [0 6 3] (add 3 to list), [0 6 3 2] (add 2 to list), [4 2 7 6] (XOR each element by 4), [1 7 2 3] (XOR each element by 5), Thus sorted order after performing queries is [1 2 3 7]

**Input: queries[][]= [{0, 2}, {1, 3}, {0, 5} ]
**Output: 1 3 5
**Explanation: [0] (initial value), [0 2] (add 2 to list). [3 1] (XOR each element by 3), [3 1 5] (add 5 to list), Thus sorted order after performing queries is [1 3 5]

Try It Yourselfredirect icon

Table of Content

[Naive Approach] Using Direct Simulation – O(n²) Time and O(n) Space

The idea is to sequentially process each query exactly as described.

#include <bits/stdc++.h> using namespace std;

// Function to return required list // after performing all the queries vector constructList(vector<vector> &queries) { // Initially list contains only 0 vector s = {0};

// Process each query one by one
for (int i = 0; i < queries.size(); i++)
{
    int type = queries[i][0];
    int x = queries[i][1];

    // Query type 0: Insert x
    if (type == 0)
    {
        s.push_back(x);
    }
    
    // Query type 1: Apply XOR to all elements
    else
    {
        for (int j = 0; j < s.size(); j++)
        {
            s[j] = s[j] ^ x;
        }
    }
}

// Sort the final list
sort(s.begin(), s.end());

return s;

}

// Driver code int main() { vector<vector> queries = { {0, 6}, {0, 3}, {0, 2}, {1, 4}, {1, 5} };

vector<int> ans = constructList(queries);

for (int x : ans)
    cout << x << " ";

return 0;

}

Java

import java.util.*;

class GFG {

// Function to return required list
// after performing all the queries
static ArrayList<Integer> constructList(int[][] queries)
{
    // Initially list contains only 0
    ArrayList<Integer> ans = new ArrayList<>();
    ans.add(0);

    // Process each query one by one
    for (int i = 0; i < queries.length; i++)
    {
        int type = queries[i][0];
        int x = queries[i][1];

        // Query type 0: Insert x
        if (type == 0)
        {
            ans.add(x);
        }
        // Query type 1: Apply XOR to all elements
        else
        {
            for (int j = 0; j < ans.size(); j++)
            {
                ans.set(j, ans.get(j) ^ x);
            }
        }
    }

    // Sort the final list
    Collections.sort(ans);

    return ans;
}

public static void main(String[] args)
{
    int[][] queries = {
        {0, 6}, {0, 3}, {0, 2}, {1, 4}, {1, 5}
    };

    ArrayList<Integer> ans = constructList(queries);

    for (int x : ans)
        System.out.print(x + " ");
}

}

Python

Function to return required list

after performing all the queries

def constructList(queries):

# Initially list contains only 0
s = [0]

# Process each query one by one
for i in range(len(queries)):
    type_, x = queries[i]

    # Query type 0: Insert x
    if type_ == 0:
        s.append(x)
    # Query type 1: Apply XOR to all elements
    else:
        for j in range(len(s)):
            s[j] = s[j] ^ x

# Sort the final list
s.sort()

return s

Driver code

queries = [ [0, 6], [0, 3], [0, 2], [1, 4], [1, 5] ]

ans = constructList(queries) print(*ans)

C#

using System; using System.Collections.Generic;

class GFG {

// Function to return required list
// after performing all the queries
static List<int> constructList(int[,] queries)
{
    // Initially list contains only 0
    List<int> ans = new List<int>();
    ans.Add(0);

    int n = queries.GetLength(0);

    // Process each query one by one
    for (int i = 0; i < n; i++)
    {
        int type = queries[i, 0];
        int x = queries[i, 1];

        // Query type 0: Insert x
        if (type == 0)
        {
            ans.Add(x);
        }
        // Query type 1: Apply XOR to all elements
        else
        {
            for (int j = 0; j < ans.Count; j++)
            {
                ans[j] = ans[j] ^ x;
            }
        }
    }

    // Sort the final list
    ans.Sort();

    return ans;
}

// Driver code
public static void Main()
{
    int[,] queries = {
        {0, 6}, {0, 3}, {0, 2}, {1, 4}, {1, 5}
    };

    List<int> ans = constructList(queries);

    foreach (int x in ans)
        Console.Write(x + " ");
}

}

JavaScript

// Function to return required list // after performing all the queries function constructList(queries) { // Initially list contains only 0 let s = [0];

// Process each query one by one
for (let i = 0; i < queries.length; i++)
{
    let type = queries[i][0];
    let x = queries[i][1];

    // Query type 0: Insert x
    if (type === 0)
    {
        s.push(x);
    }
    // Query type 1: Apply XOR to all elements
    else
    {
        for (let j = 0; j < s.length; j++)
        {
            s[j] = s[j] ^ x;
        }
    }
}

// Sort the final list
s.sort((a, b) => a - b);

return s;

}

// Driver code let queries = [ [0, 6], [0, 3], [0, 2], [1, 4], [1, 5] ];

let ans = constructList(queries); console.log(ans.join(" "));

`

[Optimal Approach] Using Reverse Processing + XOR – O(n log n) Time and O(n) Space

The idea is to process the queries from right to left because type-1 queries (XOR updates) affect all previously inserted elements. Instead of updating every element repeatedly, we maintain a cumulative XOR value. While traversing backward, whenever we encounter an insertion query, we apply the current cumulative XOR to it and store the result.

#include <bits/stdc++.h> using namespace std;

// Function to return required list // after performing all the queries vector constructList(vector<vector> &queries) { // Store cumulative Bitwise XOR int xr = 0;

// Initialize final list to return
vector<int> ans;

int n = queries.size();

// Perform each query
for (int i = n - 1; i >= 0; i--) 
{
    if (queries[i][0] == 0)
        ans.push_back(queries[i][1] ^ xr);
    else
        xr ^= queries[i][1];
}

// The initial value of 0
ans.push_back(xr);

// Sort the list
sort(ans.begin(), ans.end());

// Return final list
return ans;

}

int main() { vector<vector> queries = { {0, 6}, {0, 3}, {0, 2}, {1, 4}, {1, 5} }; vector ans = constructList(queries); for (int x : ans) cout << x << " "; return 0; }

Java

import java.util.*;

class GFG {

// Function to return required list
// after performing all the queries
static ArrayList<Integer> constructList(int[][] queries)
{
    // Store cumulative Bitwise XOR
    int xr = 0;

    // Initialize final list to return
    ArrayList<Integer> ans = new ArrayList<>();

    int n = queries.length;

    // Perform each query
    for (int i = n - 1; i >= 0; i--) 
    {
        if (queries[i][0] == 0)
            ans.add(queries[i][1] ^ xr);
        else
            xr ^= queries[i][1];
    }

    // The initial value of 0
    ans.add(xr);

    // Sort the list
    Collections.sort(ans);
    // Return final list
    return ans;
}

public static void main(String[] args)
{
    int[][] queries = {
        {0, 6}, {0, 3}, {0, 2}, {1, 4}, {1, 5}
    };
    int[] ans = constructList(queries);

    for (int x : ans)
        System.out.print(x + " ");
}

}

Python

Function to return required list

after performing all the queries

def constructList(queries):

# Store cumulative Bitwise XOR
xr = 0

# Initialize final list to return
ans = []

n = len(queries)

# Perform each query
for i in range(n - 1, -1, -1):
    if queries[i][0] == 0:
        ans.append(queries[i][1] ^ xr)
    else:
        xr ^= queries[i][1]

# The initial value of 0
ans.append(xr)

ans.sort()
return ans

if name == "main": queries = [ [0, 6], [0, 3], [0, 2], [1, 4], [1, 5] ]

ans = constructList(queries) print(*ans)

C#

using System; using System.Collections.Generic;

class GFG {

// Function to return required list
// after performing all the queries
static List<int> constructList(int[,] queries)
{
    // Store cumulative Bitwise XOR
    int xr = 0;

    // Initialize final list to return
    List<int> ans = new List<int>();

    int n = queries.GetLength(0);

    // Perform each query
    for (int i = n - 1; i >= 0; i--) 
    {
        if (queries[i, 0] == 0)
            ans.Add(queries[i, 1] ^ xr);
        else
            xr ^= queries[i, 1];
    }

    // The initial value of 0
    ans.Add(xr);

    ans.Sort();
    return ans;
}

public static void Main()
{
    int[,] queries = {
        {0, 6}, {0, 3}, {0, 2}, {1, 4}, {1, 5}
    };

    List<int> ans = constructList(queries);

    foreach (int x in ans)
        Console.Write(x + " ");
}

}

JavaScript

// Function to return required list // after performing all the queries function constructList(queries) { // Store cumulative Bitwise XOR let xr = 0;

// Initialize final list to return
let ans = [];

let n = queries.length;

// Perform each query
for (let i = n - 1; i >= 0; i--) 
{
    if (queries[i][0] === 0)
        ans.push(queries[i][1] ^ xr);
    else
        xr ^= queries[i][1];
}

// The initial value of 0
ans.push(xr);

ans.sort((a, b) => a - b);
return ans;

}

// Driver Code let queries = [ [0, 6], [0, 3], [0, 2], [1, 4], [1, 5] ];

let ans = constructList(queries); console.log(ans.join(" "));

`