import
java.util.Arrays;
class
Main {
public
static
void
main(String[] args)
{
long
[] arr = {
1
,
2
,
4
,
8
};
long
[][] Q = {
new
long
[] {
1
,
4
},
new
long
[] {
2
,
3
},
new
long
[] {
1
,
3
} };
long
[][] pre =
new
long
[
100001
][];
Arrays.setAll(pre, i ->
new
long
[
32
]);
processing(arr, pre);
long
[] ans = processQuery(Q, pre);
System.out.println(String.join(
", "
, Arrays.toString(ans)));
}
private
static
void
processing(
long
[] v,
long
[][] pre) {
long
N = v.length;
for
(
long
i =
0
; i < N; i++) {
String b = Long.toBinaryString(v[(
int
) i]);
b =
"0"
.repeat((
int
) (
32
- b.length())) + b;
b =
new
StringBuilder(b).reverse().toString();
long
sum =
0
;
if
(i !=
0
) {
pre[(
int
) i] = Arrays.copyOf(pre[(
int
) (i -
1
)], pre[(
int
) (i -
1
)].length);
}
for
(
int
j =
0
; j <
32
; j++) {
if
(b.charAt(j) ==
'1'
) {
sum += (
long
) Math.pow(
2
, j);
}
else
{
pre[(
int
) i][j] += (
long
) Math.pow(
2
, j) - sum;
}
}
}
}
private
static
long
[] processQuery(
long
[][] Q,
long
[][] pre) {
long
[] ans =
new
long
[Q.length];
for
(
long
i =
0
; i < Q.length; i++) {
Q[(
int
) i][
0
] -=
1
;
Q[(
int
) i][
1
] -=
1
;
long
min1 = Long.MAX_VALUE;
if
(Q[(
int
) i][
0
] ==
0
) {
for
(
long
j =
0
; j <
32
; j++) {
min1 =(
long
) Math.min(pre[(
int
) Q[(
int
) i][
1
]][(
int
) j], min1);
}
}
else
{
for
(
long
j =
0
; j <
32
; j++) {
min1 =(
long
) Math.min(
pre[(
int
) Q[(
int
) i][
1
]][(
int
) j] - pre[(
int
) (Q[(
int
) i][
0
] -
1
)][(
int
) j], min1);
}
}
ans[(
int
)i] = min1;
}
return
ans;
}
}