ijdZddlZddlmZmZdeedeedffdZded edefd Zd edeeeffd Zd edeedfde fdZ dS)a  Given a list of integers, made up of (hopefully) a small number of long runs of consecutive integers, compute a representation of the form ((start1, end1), (start2, end2) ...). Then answer the question "was x present in the original list?" in time O(log(# runs)). N)ListTuplelist_return.cjt|}g}d}tt|D]u}|dzt|kr||||dzdz kr1||dz|dz}|t |d|ddz|}vt |S)aRepresent a list of integers as a sequence of ranges: ((start_0, end_0), (start_1, end_1), ...), such that the original integers are exactly those x such that start_i <= x < end_i for some i. Ranges are encoded as single integers (start << 32 | end), not as tuples. r)sortedrangelenappend _encode_rangetuple)r sorted_listranges last_writei current_ranges r.s tCyU38_,33,S,U38_,,,,CsCxTr