using
System;
using
System.Collections.Generic;
class
GFG {
static
bool
ispos(
int
L,
int
R,
int
K,
List<List<
int
> > pre)
{
int
sze = R - L + 1;
int
bitwiseANDLtoR = 0;
for
(
int
i = 1; i <= 31; i++) {
int
numBit = pre[R][i] - pre[L - 1][i];
if
(sze == numBit)
bitwiseANDLtoR += (1 << (i - 1));
}
return
bitwiseANDLtoR >= K;
}
static
void
minimizeMaximumAbsDiff(
int
[] A,
int
N,
int
[][] Q,
int
M)
{
List<List<
int
> > pre =
new
List<List<
int
> >(N + 1);
for
(
int
i = 0; i <= N; i++) {
pre.Add(
new
List<
int
>(33));
for
(
int
j = 0; j <= 32; j++) {
pre[i].Add(0);
}
}
for
(
int
i = 0; i < N; i++) {
for
(
int
j = 0; j <= 31; j++) {
if
(((1 << j) & A[i]) != 0) {
pre[i + 1][j + 1]++;
}
}
}
for
(
int
i = 1; i <= N; i++) {
for
(
int
j = 1; j <= 31; j++) {
pre[i][j] += pre[i - 1][j];
}
}
for
(
int
i = 0; i < M; i++) {
int
low = Q[i][0], high = N;
while
(high - low > 1) {
int
mid = (low + high) / 2;
if
(ispos(Q[i][0], mid, Q[i][1], pre)) {
low = mid;
}
else
{
high = mid - 1;
}
}
if
(ispos(Q[i][0], high, Q[i][1], pre))
Console.Write(high +
" "
);
else
if
(ispos(Q[i][0], low, Q[i][1], pre))
Console.Write(low +
" "
);
else
Console.Write(-1 +
" "
);
}
Console.WriteLine();
}
public
static
void
Main(
string
[] args)
{
int
N = 5;
int
[] A = { 15, 14, 17, 42, 34 };
int
M = 3;
int
[][] Q
= {
new
int
[] { 1, 7 },
new
int
[] { 2, 15 },
new
int
[] { 4, 5 } };
minimizeMaximumAbsDiff(A, N, Q, M);
int
N1 = 5;
int
[] A1 = { 7, 5, 3, 1, 7 };
int
M1 = 2;
int
[][] Q1
= {
new
int
[] { 1, 7 },
new
int
[] { 2, 3 } };
minimizeMaximumAbsDiff(A1, N1, Q1, M1);
}
}