function smaller(arr) {
var n = arr.length, node = null, result, newArr = new Array(n);
function addTo(node, value, smallerCount){
if(node === null) { //старт
node = { value: value, lowerCount: 0, count: 1, left: null, right: null };
result = smallerCount;
}
else if(node.value === value){ // баланс
node.count++;
result = smallerCount + node.lowerCount;
}
else if(value < node.value){
node.lowerCount++;
node.left = addTo(node.left, value, smallerCount);
// дублирующее количество правых +1
}
else node.right = addTo(node.right, value, smallerCount + node.count + node.lowerCount); // количество меньших чисел
return node;
}
for(var i = n-1; i >= 0; i--) {
node = addTo(node, arr[i], 0);
newArr[i] = result;
}
return newArr;
}
лучше шестерки под чаек решать, чем так загоняться