<script>
class Node
{
constructor() {
this
.value = 0;
this
.max_digit_sum = 0;
}
}
let tree =
new
Array(4 * 10000);
function
digitSum(x)
{
let sum = 0;
while
(x > 0)
{
sum += (x % 10);
x = parseInt(x / 10, 10);
}
return
sum;
}
function
build(a, index, beg, end)
{
if
(beg == end)
{
tree[index].value = a[beg];
tree[index].max_digit_sum = digitSum(a[beg]);
}
else
{
let mid = parseInt((beg + end) / 2, 10);
build(a, 2 * index + 1, beg, mid);
build(a, 2 * index + 2, mid + 1, end);
if
(tree[2 * index + 1].max_digit_sum >
tree[2 * index + 2].max_digit_sum)
{
tree[index].max_digit_sum =
tree[2 * index + 1].max_digit_sum;
tree[index].value =
tree[2 * index + 1].value;
}
else
if
(tree[2 * index + 2].max_digit_sum >
tree[2 * index + 1].max_digit_sum)
{
tree[index].max_digit_sum =
tree[2 * index + 2].max_digit_sum;
tree[index].value =
tree[2 * index + 2].value;
}
else
{
tree[index].max_digit_sum =
tree[2 * index + 2].max_digit_sum;
tree[index].value =
Math.max(tree[2 * index + 2].value,
tree[2 * index + 1].value);
}
}
}
function
query(index, beg, end, l, r)
{
let result =
new
Node();
result.value = result.max_digit_sum = -1;
if
(beg > r || end < l)
return
result;
if
(beg >= l && end <= r)
return
tree[index];
let mid = parseInt((beg + end) / 2, 10);
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);
let left = query(2 * index + 1, beg,
mid, l, r);
let right = query(2 * index + 2, mid + 1,
end, l, r);
if
(left.max_digit_sum > right.max_digit_sum)
{
result.max_digit_sum = left.max_digit_sum;
result.value = left.value;
}
else
if
(right.max_digit_sum > left.max_digit_sum)
{
result.max_digit_sum = right.max_digit_sum;
result.value = right.value;
}
else
{
result.max_digit_sum = left.max_digit_sum;
result.value = Math.max(right.value, left.value);
}
return
result;
}
let a = [16, 12, 43, 55];
let N = a.length;
for
(let i = 0; i < tree.length; i++)
tree[i] =
new
Node();
build(a, 0, 0, N - 1);
document.write(query(0, 0,
N - 1,
0, 3).value +
"</br>"
);
document.write(query(0, 0,
N - 1,
0, 2).value +
"</br>"
);
</script>