[docs]115defmax_right(self,l:int,f:Callable[[T],bool])->int:116"""Find the largest index R s.t. f([l, R)) == True. / O(\\log{n})"""117assert(1180<=l<=self._n119),f"IndexError: {self.__class__.__name__}.max_right({l}, f) index out of range"120# assert f(self._e), \121# f'{self.__class__.__name__}.max_right({l}, f), f({self._e}) must be true.'122ifl==self._n:123returnself._n124l+=self._size125s=self._e126whileTrue:127whilel&1==0:128l>>=1129ifnotf(self._op(s,self._data[l])):130whilel<self._size:131l<<=1132iff(self._op(s,self._data[l])):133s=self._op(s,self._data[l])134l|=1135returnl-self._size136s=self._op(s,self._data[l])137l+=1138ifl&-l==l:139break140returnself._n
141
[docs]142defmin_left(self,r:int,f:Callable[[T],bool])->int:143"""Find the smallest index L s.t. f([L, r)) == True. / O(\\log{n})"""144assert(1450<=r<=self._n146),f"IndexError: {self.__class__.__name__}.min_left({r}, f) index out of range"147# assert f(self._e), \148# f'{self.__class__.__name__}.min_left({r}, f), f({self._e}) must be true.'149ifr==0:150return0151r+=self._size152s=self._e153whileTrue:154r-=1155whiler>1andr&1:156r>>=1157ifnotf(self._op(self._data[r],s)):158whiler<self._size:159r=r<<1|1160iff(self._op(self._data[r],s)):161s=self._op(self._data[r],s)162r^=1163returnr+1-self._size164s=self._op(self._data[r],s)165ifr&-r==r:166break167return0