class wavlet_matrix: def __init__(self,lis): self.log = 0 self.N = len(lis); self.maxi = max(lis) while ((1 << self.log) - 1 < self.maxi): self.log += 1 self.matrix = [] mae = lis[:] for i in range(self.log-1,-1,-1): nxt = [0] _zero = [] _one = [] for j in range(len(mae)): nxt.append(nxt[-1] + ((mae[j] >> i) & 1)) if ((mae[j] >> i) & 1) == 0: _zero.append(mae[j]) else: _one.append(mae[j]) self.matrix.append(nxt) mae = _zero + _one self.matrix.reverse() def get_subtree_range(self,h,l,r): a0 = l - self.matrix[h][l] a1 = self.matrix[h][l] b0 = r - self.matrix[h][r] b1 = self.matrix[h][r] c0 = self.N - self.matrix[h][self.N]; return (a0, b0, c0 + a1, c0 + b1) def _get_kth_smaller(self,h,l,r,k): if h == 0: return 0 l0,r0,l1,r1 = self.get_subtree_range(h-1,l,r) if (k < r0-l0): return self._get_kth_smaller(h-1,l0,r0,k) else: return (1 << (h - 1)) + self._get_kth_smaller(h-1,l1,r1,k - (r0-l0)) def kth(self,l,r,k): return self._get_kth_smaller(self.log,l,r,k) def less_than(self,l,r,k): if k <= 0: return 0 if k >= (1 << self.log): return r - l h = self.log re = 0 now = 0 for i in range(h-1,-1,-1): l0,r0,l1,r1 = self.get_subtree_range(i,l,r) if (now + (1 << i) < k): now += (1< 0: ans = min(ans,abs(wa.kth(a-1,b,idx-1)-c)) if idx < b-a+1: ans = min(ans,abs(wa.kth(a-1,b,idx)-c)) print(ans)