Quinstreet's advertiser listing surfaces may contain thousands of variable-height cards. Implement viewport virtualization: for each scroll query, return only the item index range that can appear in the viewport, plus an overscan buffer for smooth scrolling.
Implement get_render_windows(heights, queries, overscan). heights is a list of positive integers, where heights[i] is the rendered height of item i in pixels. queries is a list of two-element lists [scroll_top, viewport_height], where both values are integers. overscan is a nonnegative integer number of additional items to include before and after the visible range.
Return a list of dictionaries in query order. Each dictionary must contain start and end, representing the half-open range [start, end) of items to render. An empty result is represented by start == end.
The list is static for all queries. Do not render or scan every item separately for each query.
def get_render_windows(heights, queries, overscan):