# Queries on XOR of greatest odd divisor of the range

Given an array of N positive integers. There are Q queries, each include a range [L, R]. For each query output the xor of greatest odd divisor of each number in that range.

Examples:

```Input : arr[] = { 3, 4, 5 }
query 1: [0, 2]
query 2: [1, 2]
Output : 7 4
Greatest odd divisor are: { 3, 1, 5 }
XOR of 3, 1, 5 is 7
XOR of 1, 5 is 4

Input : arr[] = { 2, 1, 2 }
query 1: [0, 2]
Output : 1
```

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

The idea is to precompute the greatest odd divisor of the array and store it in an array, say preXOR[]. Now, precompute and store prefix XOR of the array preXOR[]. To answer each query, return (preXOR[r] xor preXOR[l-1]).

Below is the implementatin of this approach:

## C++

 `#include ` `using` `namespace` `std; ` ` `  `// Precompute the prefix XOR of greatest  ` `// odd divisor ` `void` `prefixXOR(``int` `arr[], ``int` `preXOR[], ``int` `n) ` `{ ` `    ``// Finding the Greatest Odd divisor ` `    ``for` `(``int` `i = 0; i < n; i++) { ` `        ``while` `(arr[i] % 2 != 1) ` `            ``arr[i] /= 2; ` ` `  `        ``preXOR[i] = arr[i]; ` `    ``} ` ` `  `    ``// Finding prefix XOR ` `    ``for` `(``int` `i = 1; i < n; i++) ` `        ``preXOR[i] = preXOR[i - 1] ^ preXOR[i]; ` `} ` ` `  `// Return XOR of the range ` `int` `query(``int` `preXOR[], ``int` `l, ``int` `r) ` `{ ` `    ``if` `(l == 0) ` `        ``return` `preXOR[r]; ` `    ``else` `        ``return` `preXOR[r] ^ preXOR[l - 1]; ` `} ` ` `  `// Driven Program ` `int` `main() ` `{ ` `    ``int` `arr[] = { 3, 4, 5 }; ` `    ``int` `n = ``sizeof``(arr) / ``sizeof``(arr); ` ` `  `    ``int` `preXOR[n]; ` `    ``prefixXOR(arr, preXOR, n); ` ` `  `    ``cout << query(preXOR, 0, 2) << endl; ` `    ``cout << query(preXOR, 1, 2) << endl; ` ` `  `    ``return` `0; ` `} `

## Java

 `// Java code Queries on XOR of  ` `// greatest odd divisor of the range ` `import` `java.io.*; ` ` `  `class` `GFG  ` `{ ` `    ``// Precompute the prefix XOR of greatest  ` `    ``// odd divisor ` `    ``static` `void` `prefixXOR(``int` `arr[], ``int` `preXOR[], ``int` `n) ` `    ``{ ` `        ``// Finding the Greatest Odd divisor ` `        ``for` `(``int` `i = ``0``; i < n; i++)  ` `        ``{ ` `            ``while` `(arr[i] % ``2` `!= ``1``) ` `                ``arr[i] /= ``2``; ` `     `  `            ``preXOR[i] = arr[i]; ` `        ``} ` `     `  `        ``// Finding prefix XOR ` `        ``for` `(``int` `i = ``1``; i < n; i++) ` `            ``preXOR[i] = preXOR[i - ``1``] ^ preXOR[i]; ` `    ``} ` `     `  `    ``// Return XOR of the range ` `    ``static` `int` `query(``int` `preXOR[], ``int` `l, ``int` `r) ` `    ``{ ` `        ``if` `(l == ``0``) ` `            ``return` `preXOR[r]; ` `        ``else` `            ``return` `preXOR[r] ^ preXOR[l - ``1``]; ` `    ``} ` `     `  `    ``// Driven Program ` `    ``public` `static` `void` `main (String[] args)  ` `    ``{ ` `        ``int` `arr[] = { ``3``, ``4``, ``5` `}; ` `        ``int` `n = arr.length; ` `     `  `        ``int` `preXOR[] = ``new` `int``[n]; ` `        ``prefixXOR(arr, preXOR, n); ` `     `  `        ``System.out.println(query(preXOR, ``0``, ``2``)) ; ` `        ``System.out.println (query(preXOR, ``1``, ``2``)); ` `     `  `             `  `    ``} ` `} ` ` `  `// This article is contributed by vt_m `

## Python3

 `# Precompute the prefix XOR of greatest  ` `# odd divisor ` `def` `prefixXOR(arr, preXOR, n): ` `     `  `    ``# Finding the Greatest Odd divisor ` `    ``for` `i ``in` `range``(``0``, n, ``1``): ` `        ``while` `(arr[i] ``%` `2` `!``=` `1``): ` `            ``arr[i] ``=` `int``(arr[i] ``/` `2``)  ` ` `  `        ``preXOR[i] ``=` `arr[i] ` ` `  `    ``# Finding prefix XOR ` `    ``for` `i ``in` `range``(``1``, n, ``1``): ` `        ``preXOR[i] ``=` `preXOR[i ``-` `1``] ^ preXOR[i] ` ` `  `# Return XOR of the range ` `def` `query(preXOR, l, r): ` `    ``if` `(l ``=``=` `0``): ` `        ``return` `preXOR[r] ` `    ``else``: ` `        ``return` `preXOR[r] ^ preXOR[l ``-` `1``] ` ` `  `# Driver Code ` `if` `__name__ ``=``=` `'__main__'``: ` `    ``arr ``=` `[``3``, ``4``, ``5``] ` `    ``n ``=` `len``(arr) ` ` `  `    ``preXOR ``=` `[``0` `for` `i ``in` `range``(n)] ` `    ``prefixXOR(arr, preXOR, n) ` ` `  `    ``print``(query(preXOR, ``0``, ``2``)) ` `    ``print``(query(preXOR, ``1``, ``2``)) ` `     `  `# This code is contributed by ` `# Sahil_shelangia `

## C#

 `// C# code Queries on XOR of  ` `// greatest odd divisor of the range ` `using` `System; ` ` `  `class` `GFG  ` `{ ` `    ``// Precompute the prefix XOR of greatest  ` `    ``// odd divisor ` `    ``static` `void` `prefixXOR(``int` `[]arr,  ` `                    ``int` `[]preXOR, ``int` `n) ` `    ``{ ` `        ``// Finding the Greatest Odd divisor ` `        ``for` `(``int` `i = 0; i < n; i++)  ` `        ``{ ` `            ``while` `(arr[i] % 2 != 1) ` `                ``arr[i] /= 2; ` `     `  `            ``preXOR[i] = arr[i]; ` `        ``} ` `     `  `        ``// Finding prefix XOR ` `        ``for` `(``int` `i = 1; i < n; i++) ` `            ``preXOR[i] = preXOR[i - 1] ^ preXOR[i]; ` `    ``} ` `     `  `    ``// Return XOR of the range ` `    ``static` `int` `query(``int` `[] preXOR, ``int` `l, ``int` `r) ` `    ``{ ` `        ``if` `(l == 0) ` `            ``return` `preXOR[r]; ` `        ``else` `            ``return` `preXOR[r] ^ preXOR[l - 1]; ` `    ``} ` `     `  `    ``// Driven Program ` `    ``public` `static` `void` `Main ()  ` `    ``{ ` `        ``int` `[]arr = { 3, 4, 5 }; ` `        ``int` `n = arr.Length; ` `     `  `        ``int` `[]preXOR = ``new` `int``[n]; ` `        ``prefixXOR(arr, preXOR, n); ` `     `  `        ``Console.WriteLine(query(preXOR, 0, 2)) ; ` `        ``Console.WriteLine (query(preXOR, 1, 2)); ` `    ``} ` `} ` ` `  `// This code is contributed by vt_m `

Output:

```7
4
```

This article is contributed by Anuj Chauhan. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

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.

My Personal Notes arrow_drop_up

Improved By : sahilshelangia

Article Tags :
Practice Tags :

Be the First to upvote.

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.