Data Structures19 sections · 729 units
Open in Course

K-th Smallest in Range

Range quantile query

Find the kk-th smallest value in A[l..r]A[l..r].

This is where wavelet trees shine. Persistent segment trees also achieve O(logn)O(\log n) per query, but wavelet trees use less space and support more query types.

function kthSmallest(node, l, r, k)
    if node.lo = node.hi then
        return node.lo

    // Count elements going left
    leftCount := rank0(node.bitvector, r + 1) - rank0(node.bitvector, l)

    if k <= leftCount then
        // Answer is in left subtree
        newL := rank0(node.bitvector, l)
        newR := rank0(node.bitvector, r + 1) - 1
        return kthSmallest(node.left, newL, newR, k)
    else
        // Answer is in right subtree
        newL := rank1(node.bitvector, l)
        newR := rank1(node.bitvector, r + 1) - 1
        return kthSmallest(node.right, newL, newR, k - leftCount)

Time: O(logσ)O(\log \sigma).