// JavaScript function to count number of smaller or
// equal to given number and given row range.
const mergeSortTree = {
buildTree(idx, ss, se, a, tree) {
/*leaf node*/
if (ss === se) {
tree[idx] = a[ss];
return;
}
let mid = Math.floor((ss + se) / 2);
/* building left subtree recursively*/
this.buildTree(2 * idx + 1, ss, mid, a, tree);
/* building right subtree recursively*/
this.buildTree(2 * idx + 2, mid + 1, se, a, tree);
/* merging left and right child in sorted order */
tree[idx] = this.merge(tree[2 * idx + 1], tree[2 * idx + 2]);
},
upbound(temp, val) {
let lo = 0;
let hi = temp.length - 1;
while (hi >= lo) {
let mid = Math.floor((lo + hi) / 2);
if (temp[mid] <= val) {
lo = mid + 1;
} else {
hi = mid - 1;
}
}
return lo;
},
queryRec(node, start, end, ss, se, k, a, tree) {
/* If out of range return 0 */
if (ss > end || se < start) return 0;
/* if inside the range return count */
if (ss <= start && se >= end) {
/* binary search over the sorted
ArrayList to return count >= X */
return this.upbound(tree[node], k);
}
let mid = Math.floor((start + end) / 2);
/*searching in left subtree*/
let q1 = this.queryRec(2 * node + 1, start, mid, ss, se, k, a, tree);
/*searching in right subtree*/
let q2 = this.queryRec(2 * node + 2, mid + 1, end, ss, se, k, a, tree);
/*adding both the result*/
return q1 + q2;
},
// A wrapper over query().
query(start, end, k, a, n, sTree) {
return this.queryRec(0, 0, n - 1, start, end, k, a, sTree);
},
// merge function
merge(a, b) {
// Initialise Arraylist res with all elements of a
let res = [...a];
// Add all elements of b to res
res = res.concat(b);
// sort ArrayList res
res.sort((a, b) => a - b);
/*return sorted resultant ArrayList
created from both ArrayLists a and b*/
return res;
},
// Driver code
main() {
let n = 3;
let arr = [[2, 4, 5], [3, 4, 9], [6, 8, 10]];
// build an array of ArrayLists from above input
let a = [];
for (let i = 0; i < n; i++) {
a[i] = [];
for (let j = 0; j < n; j++) {
a[i].push(arr[i][j]);
}
}
// Construct segment tree
let tree = [];
this.buildTree(0, 0, n - 1, a, tree);
/* un-comment to print merge sort tree*/
/*for(let i=0;i<4*n;i++)
{
console.log(tree[i]);
}*/
// Answer queries
console.log(this.query(0, 1, 5, a, n, tree));
console.log(this.query(1, 2, 1, a, n, tree));
console.log(this.query(0, 2, 6, a, n, tree));
}
};
mergeSortTree.main();
// This code is contributed by lokesh.