// defaults to median when idx isn't given
static A ithSmallest(L l, int idx default l(l)/2) {
int n = l(l);
if (n <= 80)
ret get(sorted(l), idx);
int cols = (n+4)/5;
new L medians;
for (int i = 0; i < cols; i++)
medians.add(ithSmallest(subList(l, i*5, 5)));
// median of medians
A mom = ithSmallest(medians);
L setA = filter(l, a -> lessThan(a, mom));
L setB = filter(l, a -> greaterThan(a, mom));
int nA = l(setA);
if (idx < nA)
ret ithSmallest(setA, idx);
if (idx == nA)
ret mom;
ret ithSmallest(setB, idx-nA-1);
}