You are given an integer array nums and an integer p.
You are also given a 2D integer array queries, where each queries[i] = [vali, ki] and the difference between consecutiveki values is always less than 10.
For each query:
Insert vali into nums.
Let x be the kithlargest element in the current nums.
Updatep to px % (109 + 7).
Return an array ans where the ans[i] represents the value of p after processing the ith query.
Example 1:
Input:nums = [2], p = 4, queries = [[3,1],[1,2]]
Output:[64,4096]
Explanation:
i
vali
Current nums
ki
kith largest
p
New p = pk % (109 + 7)
0
3
[2, 3]
1
3
4
43 % (109 + 7) = 64
1
1
[2, 3, 1]
2
2
64
642 % (109 + 7) = 4096
Thus, ans = [64, 4096].
Example 2:
Input:nums = [7,5], p = 6, queries = [[4,3],[7,2]]
Output:[1296,220296870]
Explanation:
i
vali
Currentβββββββ nums
ki
kith largest
p
New p = pk % (109 + 7)
0
4
[7, 5, 4]
3
4
6
64 % (109 + 7) = 1296
1
7
[7, 5, 4, 7]
2
7
1296
12967 % (109 + 7) = 220296870
Thus, ans = [1296, 220296870]
Constraints:
1 <= nums.length <= 2 Γ 104
1 <= nums[i] <= 106
βββββββ1 <= p <= 106
1 <= queries.length <= 2 Γ 104
βββββββ1 <= vali <= 106
1 <= ki <= n + i + 1
|ki - ki - 1| < 10 for i > 0
Solutions
Solution 1: Two Sorted Sets
Thinking
Adjacent queries change \(k\) by less than \(10\), so the side that holds the current \(k\)-th largest can be maintained as a sliding window. Two sorted sets \(l\) and \(r\) split the values so that \(r\) always stores the \(k\) largest.
A new value enters \(r\), then elements move between the two sides until \(|r|=k\); \(r[0]\) is the \(k\)-th largest and \(p\) is updated by modular exponentiation.
Because \(k\) barely moves, the amortized number of transfers stays small.
We use two sorted sets, \(l\) and \(r\), to maintain the current array \(nums\). All elements in \(l\) are less than or equal to those in \(r\), and the number of elements in \(r\) is equal to \(k_i\).
For each query, we insert \(val_i\) into \(r\), then move the smallest element in \(r\) to \(l\) until the size of \(r\) becomes \(k_i\). At this point, the smallest element in \(r\) is the \(k_i\)-th largest element in the current \(nums\). We then use fast exponentiation to update \(p\) as \(p^x \bmod (10^9 + 7)\), and append the updated \(p\) to the answer array.
The time complexity is \(O((n + m) \log (n + m))\), and the space complexity is \(O(n + m)\), where \(n\) and \(m\) are the lengths of \(\textit{nums}\) and \(\textit{queries}\), respectively.
Solution 1 keeps two ordered sets and shuttles by \(k\). The same limits also allow a single sorted list: after each insertion, \(sl[-k]\) is already the \(k\)-th largest.
The code is shorter, no longer relies on \(k\) changing slowly, and has a smaller implementation footprint.
We use a sorted list \(\textit{sl}\) to maintain the current array \(nums\). For each query, we insert \(val_i\) into \(\textit{sl}\), then find the \(k_i\)-th largest element \(x\) in \(\textit{sl}\). Using fast exponentiation, we update \(p\) to \(p^x \bmod (10^9 + 7)\), and append the updated \(p\) to the answer array.
The time complexity is \(O((n + m) \log (n + m))\), and the space complexity is \(O(n + m)\), where \(n\) and \(m\) are the lengths of \(\textit{nums}\) and \(\textit{queries}\), respectively.