import
java.util.*;
class
GFG{
static
class
Node
{
int
value;
int
max_set_bits;
};
static
Node []tree =
new
Node[
4
*
10000
];
static
int
setBits(
int
x)
{
int
parity =
0
;
while
(x !=
0
)
{
if
(x %
2
==
1
)
parity++;
x = x >>
1
;
}
return
parity;
}
static
void
buildSegmentTree(
int
a[],
int
index,
int
beg,
int
end)
{
if
(beg == end)
{
tree[index].value = a[beg];
tree[index].max_set_bits = setBits(a[beg]);
}
else
{
int
mid = (beg + end) /
2
;
buildSegmentTree(a,
2
* index +
1
,
beg, mid);
buildSegmentTree(a,
2
* index +
2
,
mid +
1
, end);
if
(tree[
2
* index +
1
].max_set_bits >
tree[
2
* index +
2
].max_set_bits)
{
tree[index].max_set_bits =
tree[
2
* index +
1
].max_set_bits;
tree[index].value =
tree[
2
* index +
1
].value;
}
else
if
(tree[
2
* index +
2
].max_set_bits >
tree[
2
* index +
1
].max_set_bits)
{
tree[index].max_set_bits =
tree[
2
* index +
2
].max_set_bits;
tree[index].value =
tree[
2
* index +
2
].value;
}
else
{
tree[index].max_set_bits =
tree[
2
* index +
2
].max_set_bits;
tree[index].value = Math.max(
tree[
2
* index +
2
].value,
tree[
2
* index +
1
].value);
}
}
}
static
Node query(
int
index,
int
beg,
int
end,
int
l,
int
r)
{
Node result =
new
Node();
result.value = result.max_set_bits = -
1
;
if
(beg > r || end < l)
return
result;
if
(beg >= l && end <= r)
return
tree[index];
int
mid = (beg + end) /
2
;
if
(l > mid)
return
query(
2
* index +
2
, mid +
1
,
end, l, r);
if
(r <= mid)
return
query(
2
* index +
1
, beg,
mid, l, r);
Node left = query(
2
* index +
1
, beg,
mid, l, r);
Node right = query(
2
* index +
2
, mid +
1
,
end, l, r);
if
(left.max_set_bits > right.max_set_bits)
{
result.max_set_bits = left.max_set_bits;
result.value = left.value;
}
else
if
(right.max_set_bits > left.max_set_bits)
{
result.max_set_bits = right.max_set_bits;
result.value = right.value;
}
else
{
result.max_set_bits = left.max_set_bits;
result.value = Math.max(right.value,
left.value);
}
return
result;
}
public
static
void
main(String[] args)
{
int
a[] = {
18
,
9
,
8
,
15
,
14
,
5
};
int
N = a.length;
for
(
int
i =
0
; i < tree.length; i++)
tree[i] =
new
Node();
buildSegmentTree(a,
0
,
0
, N -
1
);
System.out.print(query(
0
,
0
, N -
1
,
1
,
4
).value +
"\n"
);
System.out.print(query(
0
,
0
, N -
1
,
0
,
2
).value +
"\n"
);
}
}