class SegmentTree: def __init__(self, n, p, unit, f): self.num = 2**((n-1).bit_length()) self.seg = [unit]*(2*self.num) for i in range(n): self.seg[i+self.num] = p[i] for i in range(self.num-1, 0, -1): self.seg[i] = f(self.seg[i << 1], self.seg[(i << 1)+1]) self.f = f self.unit = unit def update(self, i, x): i += self.num self.seg[i] = x while i: i >>= 1 self.seg[i] = self.f(self.seg[i << 1], self.seg[(i << 1)+1]) def query(self, l, r): ansl = ansr = self.unit l += self.num r += self.num-1 if l == r: return self.seg[l] while l < r: if l & 1: ansl = self.f(ansl, self.seg[l]) l += 1 if ~r & 1: ansr = self.f(self.seg[r], ansr) r -= 1 l >>= 1 r >>= 1 if l == r: ansl = self.f(ansl, self.seg[l]) return self.f(ansl, ansr) def f(x,y): xm1,xm2,xM=x ym1,ym2,yM=y M=max(xM,yM) if xm1