Given intervals [left, right] (inclusive, size = right − left + 1) and a list of queries, return for each query the size of the smallest interval that contains it, or -1 if none does.
Sort intervals by start and answer queries in increasing order. Push every interval that has started into a min-heap keyed by size, pop the ones that already ended, and the heap top is the answer.
1function minInterval(intervals: number[][], queries: number[]): number[] {2intervals.sort((a, b) => a[0] - b[0]);3const order = queries.map((_, i) => i).sort((a, b) => queries[a] - queries[b]);4const heap = new MinPriorityQueue<[number, number]>((e) => e[0]); // [size, right]5const res = new Array(queries.length).fill(-1);6let i = 0;7for (const qi of order) {8const q = queries[qi];9while (i < intervals.length && intervals[i][0] <= q) {10const [l, r] = intervals[i++]; heap.enqueue([r - l + 1, r]);11}12while (heap.size() && heap.front()![1] < q) heap.dequeue();13if (heap.size()) res[qi] = heap.front()![0];14}15return res;16}
Sort intervals by start; process queries from smallest to largest.
Space: play/pause · ←/→: step