Range and offset have been merged. This makes finding an offset when the range
is specified much more efficient. If a lot of entries have the same value,
we'll still end up having to do a lot of operations to find the correct offset.
This is because we don't have prev pointers at each level. Once we've found
a match, we have to walk backwards to find the first match, which means
going through them one at a time.

Still need to do this for backwards iterations