This is the hard version of the problem. The difference in the constraints between both versions are colored below in red. You can make hacks only if all versions of the problem are solved.

Marin and Gojou are playing hide-and-seek with an array.

Gojou initially perform the following steps:

First, Gojou chooses $2$ integers $l$ and $r$ such that $l \leq r$.

Then, Gojou will make an array $a$ of length $r-l+1$ which is a permutation of the array $[l,l+1,\ldots,r]$.

Finally, Gojou chooses a secret integer $x$ and sets $a_i$ to $a_i \oplus x$ for all $i$ (where $\oplus$ denotes the bitwise XOR operation ).

Marin is then given the values of $l,r$ and the final array $a$. She needs to find the secret integer $x$ to win. Can you help her?

Note that there may be multiple possible $x$ that Gojou could have chosen. Marin can find any possible $x$ that could have resulted in the final value of $a$.


-----Input-----

The first line contains a single integer $t$ ($1 \leq t \leq 10^5$) — the number of test cases.

In the first line of each test case contains two integers $l$ and $r$ (${\boldsymbol{0} \boldsymbol{\le} \boldsymbol{l}} \le r < 2^{17}$).

The second line contains $r - l + 1$ space-seperated integers of $a_1,a_2,\ldots,a_{r-l+1}$ ($0 \le a_i < 2^{17}$). It is guaranteed that array $a$ is valid.

It is guaranteed that the sum of $r - l + 1$ over all test cases does not exceed $2^{17}$.


-----Output-----

For each test case print an integer $x$. If there are multiple answers, print any.


-----Examples-----

Input
3
4 7
3 2 1 0
4 7
4 7 6 5
1 3
0 2 1
Output
4
0
3


-----Note-----

In the first test case, the original array is $[7, 6, 5, 4]$.

In the second test case, the original array is $[4, 7, 6, 5]$.

In the third test case, the original array is $[3, 1, 2]$.

Source: codeforces | Difficulty: HARD
Tags: Bit manipulation

Data structures

Mathematics

Complete search


Solutions:
import sys
input = sys.stdin.readline

def solve(l: int, r: int, s: set):
	if l % 2 == 0 and r % 2 == 1:
		t = set()
		for v in s:
			t.add(v >> 1)
		return solve(l >> 1, r >> 1, t) << 1
	else:
		for v in s:
			if v ^ 1 not in s:
				ok = True
				ans = v
				if l % 2 == 0:
					ans ^= r
				else:
					ans ^= l
				for x in s:
					if x ^ ans < l or x ^ ans > r:
						ok = False
						break
				if ok:
					return ans
t = int(input())
for _ in range(t):
	(l, r) = map(int, input().split())
	s = set(map(int, input().split()))
	print(solve(l, r, s))