There exists an infinite number line, with its origin at 0 and extending towards the positive x-axis.
You are given a 2D array queries, which contains two types of queries:
For a query of type 1, queries[i] = [1, x]. Build an obstacle at distance x from the origin. It is guaranteed that there is no obstacle at distance x when the query is asked.
For a query of type 2, queries[i] = [2, x, sz]. Check if it is possible to place a block of size szanywhere in the range [0, x] on the line, such that the block entirely lies in the range [0, x]. A block cannot be placed if it intersects with any obstacle, but it may touch it. Note that you do not actually place the block. Queries are separate.
Return a boolean array results, where results[i] is true if you can place the block specified in the ith query of type 2, and false otherwise.
Example 1:
Input:queries = [[1,2],[2,3,3],[2,3,1],[2,2,2]]
Output:[false,true,true]
Explanation:
For query 0, place an obstacle at x = 2. A block of size at most 2 can be placed before x = 3.
Place an obstacle at x = 7 for query 0. A block of size at most 7 can be placed before x = 7.
Place an obstacle at x = 2 for query 2. Now, a block of size at most 5 can be placed before x = 7, and a block of size at most 2 before x = 2.
Constraints:
1 <= queries.length <= 15 * 104
2 <= queries[i].length <= 3
1 <= queries[i][0] <= 2
1 <= x, sz <= min(5 * 104, 3 * queries.length)
The input is generated such that for queries of type 1, no obstacle exists at distance x when the query is asked.
The input is generated such that there is at least one query of type 2.
Solutions
Solution 1: Binary Indexed Tree + Ordered Set
Thinking
Obstacles are inserted only, and a query asks whether a block of size \(sz\) fits in \([0,x]\). Scanning gaps online is \(O(q^2)\).
Reversed time turns insertions into deletions, which only enlarge gaps. A Fenwick tree can store prefix maxima of gap lengths keyed by the right endpoint.
Load every obstacle plus sentinels, write gaps, then go backward: a query checks the prefix maximum up to \(pre\) and the tail \(x-pre\); a deletion updates the successor gap to \(nxt-pre\). Reverse the collected answers.
Obstacles are only inserted, so we can process the queries offline in reverse and turn "insert an obstacle" into "delete an obstacle". After a deletion the adjacent gap only grows, and a Fenwick tree can maintain prefix maxima.
Put all obstacles into an ordered set, and add sentinels \(0\) and \(m+1\), where \(m\) is the maximum coordinate. For every pair of neighboring obstacles \(x_1, x_2\), update index \(x_2\) in the Fenwick tree with the gap \(x_2 - x_1\).
Then scan the queries from back to front:
Type \(2\): find the last obstacle \(pre \le x\). The block can be placed if the maximum gap in \([0, pre]\) or the tail gap \((pre, x]\) is at least \(sz\).
Type \(1\): delete obstacle \(x\), and update the gap at its successor \(nxt\) to \(nxt - pre\).
The time complexity is \(O(q \times \log m)\), and the space complexity is \(O(m)\), where \(q\) is the number of queries and \(m\) is the maximum coordinate.