You are given an integer array nums of length n and an integer p.
A non-empty subsequence of nums is called good if:
n.p.You are also given a 2D integer array queries of length q, where each queries[i] = [indi, vali] indicates that you should update nums[indi] to vali.
After each query, determine whether there exists any good subsequence in the current array.
Return the number of queries for which a good subsequence exists.
The termgcd(a, b) denotes the greatest common divisor of a and b.
Example 1:
Input: nums = [4,8,12,16], p = 2, queries = [[0,3],[2,6]]
Output: 1
Explanation:
| i | [indi, vali] |
Operation | Updated nums |
Any good Subsequence |
|---|---|---|---|---|
| 0 | [0, 3] |
Update nums[0] to 3 |
[3, 8, 12, 16] |
No, as no subsequence has GCD exactly p = 2 |
| 1 | [2, 6] |
Update nums[2] to 6 |
[3, 8, 6, 16] |
Yes, subsequence [8, 6] has GCD exactly p = 2 |
Thus, the answer is 1.
Example 2:
Input: nums = [4,5,7,8], p = 3, queries = [[0,6],[1,9],[2,3]]
Output: 2
Explanation:
| i | [indi, vali] |
Operation | Updated nums |
Any good Subsequence |
|---|---|---|---|---|
| 0 | [0, 6] |
Update nums[0] to 6 |
[6, 5, 7, 8] |
No, as no subsequence has GCD exactly p = 3 |
| 1 | [1, 9] |
Update nums[1] to 9 |
[6, 9, 7, 8] |
Yes, subsequence [6, 9] has GCD exactly p = 3 |
| 2 | [2, 3] |
Update nums[2] to 3 |
[6, 9, 3, 8] |
Yes, subsequence [6, 9, 3] has GCD exactly p = 3 |
Thus, the answer is 2.
Example 3:
Input: nums = [5,7,9], p = 2, queries = [[1,4],[2,8]]
Output: 0
Explanation:
| i | [indi, vali] |
Operation | Updated nums |
Any good Subsequence |
|---|---|---|---|---|
| 0 | [1, 4] |
Update nums[1] to 4 |
[5, 4, 9] |
No, as no subsequence has GCD exactly p = 2 |
| 1 | [2, 8] |
Update nums[2] to 8 |
[5, 4, 8] |
No, as no subsequence has GCD exactly p = 2 |
Thus, the answer is 0.
Constraints:
2 <= n == nums.length <= 5 * 1041 <= nums[i] <= 5 * 1041 <= queries.length <= 5 * 104queries[i] = [indi, vali]1 <= vali, p <= 5 * 1040 <= indi <= n - 1Problem Overview: You are given an array and multiple queries. Each query asks about the number of good subsequences that satisfy a specific constraint defined in the problem. The challenge is answering many queries efficiently without recomputing subsequences from scratch every time.
Approach 1: Brute Force Enumeration (O(2^n) time, O(n) space)
The most direct idea is to generate every possible subsequence of the array and check whether it satisfies the “good” condition. For each query, filter subsequences that fall within the required constraints and count them. This approach uses recursive generation or bitmask enumeration. The problem is exponential growth: an array of size n has 2^n subsequences, so even moderate inputs become impossible to handle.
Approach 2: Dynamic Programming per Query (O(n^2) time, O(n) space)
A better strategy uses dynamic programming to build subsequences incrementally. Let dp[i] represent the number of valid subsequences ending at index i. For each position, iterate over previous indices and extend subsequences that still satisfy the “good” constraint. For every query, recompute or partially recompute these values within the relevant range. This reduces exponential complexity but still becomes slow when both n and the number of queries are large.
Approach 3: DP with Fenwick Tree / Segment Tree (O((n + q) log n) time, O(n) space)
The optimal solution combines dynamic programming with a range data structure such as a segment tree or Fenwick tree. Instead of scanning all previous elements, the structure maintains aggregated counts of valid subsequences. After coordinate compression (if values are large), each step performs fast prefix or range queries to compute how many subsequences can extend to the current element. Updates insert the new counts back into the tree. Queries can then be answered in logarithmic time using the maintained prefix sums or range aggregates.
This method avoids recomputing subsequences repeatedly. Each element contributes once, and each query performs only logarithmic operations. The combination of DP state transitions and tree-based range queries is a common technique for subsequence counting problems where constraints depend on relative ordering or value ranges.
Recommended for interviews: Interviewers expect the optimized DP with a Fenwick tree or segment tree. Showing the brute-force idea demonstrates understanding of subsequence generation, but recognizing that repeated scans are too slow and replacing them with logarithmic range queries shows strong algorithmic skill.
Solutions for this problem are being prepared.
Try solving it yourself| Approach | Time | Space | When to Use |
|---|---|---|---|
| Brute Force Subsequence Enumeration | O(2^n) | O(n) | Conceptual understanding of subsequences or very small arrays |
| Dynamic Programming per Query | O(n^2) | O(n) | When constraints are moderate and query count is small |
| DP with Fenwick Tree / Segment Tree | O((n + q) log n) | O(n) | Optimal solution for large arrays and many queries |
Practice Good Subsequence Queries with our built-in code editor and test cases.
Practice on FleetCodePractice this problem
Open in Editor