�'�X� � @ sF d Z d d l Z d d � Z d d � Z d d � Z d d � Z d S)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)). � Nc C s� t | � } g } d } x� t t | � � D]{ } | d t | � k rf | | | | d d k rf q+ | | d | d � } | j t | d | d d � � | } q+ Wt | � S)a Represent 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 ���r )�sorted�range�len�append� _encode_range�tuple)Zlist_Zsorted_list�rangesZ last_write�iZ current_range� r � /intranges.py�intranges_from_list s " r c C s | d >| BS)N� r )�start�endr r r r s r c C s | d ?| d @f S)Nr r l l �� r )�rr r r � _decode_range"