Related Articles

# XOR of a subarray (range of elements) | Set 2

• Difficulty Level : Easy
• Last Updated : 13 Jul, 2021

Given an array integer arr[] of size N and Q queries. Each query is of the form (L, R), where L and R are indices of the array. The task is to find the XOR value of the subarray arr[L…R]

Examples:

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.

Input: arr[] = {2, 5, 1, 6, 1, 2, 5} query[] = {{1, 4}}
Output:
The XOR value of arr[1…4] is 3.

Input: arr[] = {2, 5, 1, 6, 1, 2, 5} query[] = {{0, 6}}
Output:
The XOR value of arr[0…6] is 6.

Approach: Here we will discuss a constant space solution, but we will modify the input array.

1. Update the input array from index 1 to N – 1, such that arr[i] stores the XOR from arr to arr[i]

arr[i] = XOR(arr, arr, .., arr[i])

2. To process a query from L to R just return arr[L-1] ^ arr[R].

For example:

Consider the example: arr[] = { 3, 2, 4, 5, 1, 1, 5, 3 }, query[] = {{1, 4 }, { 3, 7}}
After taking the XOR of consecutive elements, arr[] = {3, 1, 5, 0, 1, 0, 5, 6}
For first query {1, 4} ans = arr ^ arr = 3 ^ 1 = 2
For the second query {3, 7} ans = arr ^ arr = 5 ^ 6 = 3

Below is the implementation of the above approach:

## C++

 `// C++ program to find XOR``// in a range from L to R` `#include ``using` `namespace` `std;` `// Function to find XOR``// in a range from L to R``void` `find_Xor(``int` `arr[],``              ``pair<``int``, ``int``> query[],``              ``int` `N, ``int` `Q)``{``    ``// Compute xor from arr to arr[i]``    ``for` `(``int` `i = 1; i < N; i++) {``        ``arr[i] = arr[i] ^ arr[i - 1];``    ``}` `    ``int` `ans = 0;` `    ``// process every query``    ``// in constant time``    ``for` `(``int` `i = 0; i < Q; i++) {` `        ``// if L==0``        ``if` `(query[i].first == 0)``            ``ans = arr[query[i].second];``        ``else``            ``ans = arr[query[i].first - 1]``                  ``^ arr[query[i].second];` `        ``cout << ans << endl;``    ``}``}` `// Driver Code``int` `main()``{``    ``int` `arr[] = { 3, 2, 4, 5,``                  ``1, 1, 5, 3 };``    ``int` `N = 8;``    ``int` `Q = 2;``    ``pair<``int``, ``int``> query[Q]``        ``= { { 1, 4 },``            ``{ 3, 7 } };` `    ``// query[]``    ``find_Xor(arr, query, N, Q);``    ``return` `0;``}`

## Java

 `// Java program to find XOR``// in a range from L to R``class` `GFG{``    ` `static` `class` `pair``{``    ``int` `first, second;``    ``public` `pair(``int` `first, ``int` `second)``    ``{``        ``this``.first = first;``        ``this``.second = second;``    ``}``}` `// Function to find XOR``// in a range from L to R``static` `void` `find_Xor(``int` `arr[],``                     ``pair query[],``                     ``int` `N, ``int` `Q)``{``    ` `    ``// Compute xor from arr to arr[i]``    ``for``(``int` `i = ``1``; i < N; i++)``    ``{``       ``arr[i] = arr[i] ^ arr[i - ``1``];``    ``}``    ` `    ``int` `ans = ``0``;` `    ``// Process every query``    ``// in constant time``    ``for``(``int` `i = ``0``; i < Q; i++)``    ``{``        ` `       ``// If L==0``       ``if` `(query[i].first == ``0``)``           ``ans = arr[query[i].second];``       ``else``           ``ans = arr[query[i].first - ``1``] ^``                 ``arr[query[i].second];` `       ``System.out.print(ans + ``"\n"``);``    ``}``}` `// Driver Code``public` `static` `void` `main(String[] args)``{``    ``int` `arr[] = { ``3``, ``2``, ``4``, ``5``,``                  ``1``, ``1``, ``5``, ``3` `};``    ``int` `N = ``8``;``    ``int` `Q = ``2``;``    ` `    ``pair query[] = { ``new` `pair(``1``, ``4``),``                     ``new` `pair(``3``, ``7``) };` `    ``// query[]``    ``find_Xor(arr, query, N, Q);``}``}` `// This code is contributed by gauravrajput1`

## Python3

 `# Python3 program to find XOR``# in a range from L to R` `# Function to find XOR``# in a range from L to R``def` `find_Xor(arr, query, N, Q):``    ` `    ``# Compute xor from arr to arr[i]``    ``for` `i ``in` `range``(``1``, N):``        ``arr[i] ``=` `arr[i] ^ arr[i ``-` `1``]``        ` `    ``ans ``=` `0``    ` `    ``# Process every query``    ``# in constant time``    ``for` `i ``in` `range``(Q):``        ` `        ``# If L == 0``        ``if` `query[i][``0``] ``=``=` `0``:``            ``ans ``=` `arr[query[i][``1``]]``        ``else``:``            ``ans ``=` `(arr[query[i][``0``] ``-` `1``] ^``                   ``arr[query[i][``1``]])``        ``print``(ans)``    ` `# Driver code``def` `main():``    ` `    ``arr ``=` `[ ``3``, ``2``, ``4``, ``5``, ``1``, ``1``, ``5``, ``3` `]``    ``N ``=` `8``    ``Q ``=` `2``    ` `    ``# query[]``    ``query ``=` `[ [ ``1``, ``4` `],``              ``[ ``3``, ``7` `] ]``              ` `    ``find_Xor(arr, query, N, Q)``    ` `main()` `# This code is contributed by Stuti Pathak`

## C#

 `// C# program to find XOR``// in a range from L to R``using` `System;` `class` `GFG{   ``class` `pair``{``    ``public` `int` `first, second;``    ``public` `pair(``int` `first, ``int` `second)``    ``{``        ``this``.first = first;``        ``this``.second = second;``    ``}``}`` ` `// Function to find XOR``// in a range from L to R``static` `void` `find_Xor(``int` `[]arr,``                     ``pair []query,``                     ``int` `N, ``int` `Q)``{``     ` `    ``// Compute xor from arr to arr[i]``    ``for``(``int` `i = 1; i < N; i++)``    ``{``       ``arr[i] = arr[i] ^ arr[i - 1];``    ``}``     ` `    ``int` `ans = 0;`` ` `    ``// Process every query``    ``// in constant time``    ``for``(``int` `i = 0; i < Q; i++)``    ``{``         ` `       ``// If L==0``       ``if` `(query[i].first == 0)``           ``ans = arr[query[i].second];``       ``else``           ``ans = arr[query[i].first - 1] ^``                 ``arr[query[i].second];`` ` `       ``Console.Write(ans + ``"\n"``);``    ``}``}`` ` `// Driver Code``public` `static` `void` `Main(String[] args)``{``    ``int` `[]arr = { 3, 2, 4, 5,``                  ``1, 1, 5, 3 };``    ``int` `N = 8;``    ``int` `Q = 2;``     ` `    ``pair []query = { ``new` `pair(1, 4),``                     ``new` `pair(3, 7) };`` ` `    ``// query[]``    ``find_Xor(arr, query, N, Q);``}``}` `// This code is contributed by 29AjayKumar`

## Javascript

 ``
Output:
```2
3```

Time Complexity: O (N + Q)
Auxiliary Space: O (1)

My Personal Notes arrow_drop_up