import
java.util.*;
class
GFG{
static
int
minVal(
int
x,
int
y) {
return
(x < y) ? x : y;
}
static
int
getMid(
int
s,
int
e) {
return
s + (e - s) /
2
;
}
static
int
RMQUtil(
int
[] st,
int
ss,
int
se,
int
qs,
int
qe,
int
index)
{
if
(qs <= ss && qe >= se)
return
st[index];
if
(se < qs || ss > qe)
return
Integer.MAX_VALUE;
int
mid = getMid(ss, se);
return
minVal(RMQUtil(st, ss, mid, qs, qe,
2
* index +
1
),
RMQUtil(st, mid +
1
, se, qs, qe,
2
* index +
2
));
}
static
int
RMQ(
int
[] st,
int
n,
int
qs,
int
qe)
{
if
(qs <
0
|| qe > n -
1
|| qs > qe)
{
System.out.println(
"Invalid Input"
);
return
-
1
;
}
return
RMQUtil(st,
0
, n -
1
, qs, qe,
0
);
}
static
int
constructSTUtil(
int
arr[],
int
ss,
int
se,
int
[] st,
int
si)
{
if
(ss == se) {
st[si] = arr[ss];
return
arr[ss];
}
int
mid = getMid(ss, se);
st[si] = minVal(constructSTUtil(arr, ss, mid, st, si *
2
+
1
),
constructSTUtil(arr, mid +
1
, se, st, si *
2
+
2
));
return
st[si];
}
static
int
[] constructST(
int
arr[],
int
n)
{
int
x = (
int
) (Math.ceil(Math.log(n) / Math.log(
2
)));
int
max_size =
2
* (
int
) Math.pow(
2
, x) -
1
;
int
[] st =
new
int
[max_size];
constructSTUtil(arr,
0
, n -
1
, st,
0
);
return
st;
}
public
static
void
main(String[] args)
{
int
[] arr = {
3
,
2
,
1
,
4
,
5
};
int
n = arr.length;
int
[][] queries = { {
1
,
2
}, {
2
,
3
} };
int
q = queries.length;
int
[] st = constructST(arr, n);
for
(
int
i =
0
; i < q; i++)
{
int
L = queries[i][
0
];
int
R = queries[i][
1
];
int
left = ((L -
1
) <
0
) ? Integer.MAX_VALUE : RMQ(st, n,
0
, L -
1
);
int
right = ((R +
1
) >= n) ? Integer.MAX_VALUE : RMQ(st, n, R +
1
, n -
1
);
int
minn = Math.min(left, right);
if
(minn == Integer.MAX_VALUE)
System.out.println(-
1
);
else
System.out.println(minn);
}
}
}