JavaScript
var arrT = [1, 2, 2, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 8, 8, 8, 8, 8, 8, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 11, 12, 3, 13, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 19, 19, 19, 19, 19, 19, 20];
function uniqueIndex(start, end, arr, map) {
if (start === end) {
return;
}
var startValue = arr[start],
endValue = arr[end];
initUniqueStartObj(startValue, map, start, arr[start - 1]);
initUniqueEndObj(endValue, map, end, arr[end - 1], arr.length);
if (endValue === startValue) {
if (end === arr.length - 1 || arr[end + 1] !== startValue) {
setMapObj(startValue, map, end, 'to');
if (end + 1 < arr.length) {
setMapObj(arr[end + 1], map, end + 1, 'from');
}
return;
}
} else {
if ((start === end - 1) && arr[start - 1] === startValue) {
setMapObj(startValue, map, start, 'to');
}
}
var middle = Math.floor((start + end) / 2);
var middleValue = arr[middle],
nextValue = arr[middle + 1];
if (middleValue !== nextValue) {
setMapObj(middleValue, map, middle, 'to');
}
uniqueIndex(start, middle, arr, map);
uniqueIndex(middle + 1, end, arr, map);
}
function initUniqueStartObj(key, obj, value, toComparekey) {
if ((value > 0 && toComparekey !== key) || value === 0) {
setMapObj(key, obj, value, 'from');
}
}
function initUniqueEndObj(key, obj, end, toCompareKey, arrLength) {
if (end > 0 && toCompareKey !== key) {
setMapObj(key, obj, end, 'from');
if (end === arrLength - 1) {
setMapObj(key, obj, end, 'to');
}
}
}
function setMapObj(key, obj, value, prop) {
if (!obj[key]) {
obj[key] = {};
}
obj[key][prop] = value;
}
function loopThrough(arr, map) {
for (var i = 0; i < arr.length; i++) {
var item = arr[i];
if (!map[item]) {
map[item] = {
from: i
};
}
if ((i + 1 < arr.length &&...