3152. Special Array II

Question

CleanShot 2024-09-18 at 12.52.25.png

Code

class Solution:
    def isArraySpecial(self, nums: List[int], queries: List[List[int]]) -> List[bool]:
        parity = []

        for i in range(len(nums)):
            if i == 0:
                parity.append(i)
            else:
                if (nums[i] + nums[i - 1]) % 2 == 1:
                    continue
                else:
                    parity.append(i)

        def isSpecial(query):

            l, r = 0, len(parity) - 1


            while l <= r:
                mid = l + (r - l) // 2

                if  parity[mid] > query[0]:
                    r = mid - 1
                else:
                    if mid == len(parity) - 1 or parity[mid + 1] > query[0]:
                        l = mid
                        break
                    
                    l = mid + 1

            if l >= len(nums) or r < 0:
                return False

            last = len(nums) - 1 if l == len(parity) - 1 else parity[l + 1] - 1
            return query[1] <= last

        return [isSpecial(q) for q in queries]