Implement efficient search patterns for large-scale data retrieval.
Given a nondecreasing sorted array values and a list of integer queries, return one [first, last] index range for each query. If a query does not appear, return [-1, -1]. The ranges must preserve query order. Use binary search so each query is processed without scanning the full array.
def search_ranges(values, queries):