BlockedIndex: static distinct integer keys, B>=2; point returns (found, reads), range(lo,hi) returns sorted half-open keys and reads. Cold-cache simulated block reads; output costs O(k) space. external_sort: integer records, B>0, m>=3; initial runs mB, merge fan-in m-1. Count initial and every merge pass; singleton groups still copied. Logical data buffers exclude O(m) heap/cursor metadata. Simulated disk and returned list remain resident in Python; no real disk/RSS/throughput claim.