class Query {
int index;
int queryTimeStamp;
int result;
public Query(int index, int queryTimeStamp) {
this.index = index;
this.queryTimeStamp = queryTimeStamp;
this.result = -1;
}
@Override
public String toString() {
return "[" + index + "," + queryTimeStamp + "," + result + "]";
}
public void setResult(int result) {
this.result = result;
}
}
class IntervalComparator implements Comparator<int[]> {
public static int getSize(int[] interval) {
return (interval[1] - interval[0] + 1);
}
@Override
public int compare(int[] o1, int[] o2) {
int o1Size = getSize(o1), o2Size = getSize(o2);
if (o1Size != o2Size) {
return (o1Size - o2Size);
}
return (o1[1] - o2[1]);
}
}
class Solution {
public int[] minInterval(int[][] intervals, int[] queries) {
int numIntervals = intervals.length;
int numQueries = queries.length;
Arrays.sort(intervals, (o1, o2) -> (o1[0] - o2[0]));
Query[] sortedQueries = new Query[numQueries];
for (int i = 0; i < numQueries; i++) sortedQueries[i] =
new Query(i, queries[i]);
Arrays.sort(
sortedQueries,
(q1, q2) -> (q1.queryTimeStamp - q2.queryTimeStamp)
);
Comparator<int[]> comparator = new IntervalComparator();
PriorityQueue<int[]> pq = new PriorityQueue<>(comparator);
int idx = 0;
for (Query query : sortedQueries) {
while (
(idx < numIntervals) &&
(query.queryTimeStamp >= intervals[idx][0])
) {
pq.add(intervals[idx]);
idx++;
}
while (!pq.isEmpty() && (pq.peek()[1] < query.queryTimeStamp)) {
pq.remove();
}
int ans = pq.isEmpty() ? -1 : IntervalComparator.getSize(pq.peek());
query.setResult(ans);
}
int[] results = new int[numQueries];
for (Query query : sortedQueries) {
results[query.index] = query.result;
}
return results;
}
}