class Arbore:
def __init__(self, a = [], n = 0):
self.aint = [0] * 4 * (n + 1)
self.n = n
self.Build(a, 1, 1, n)
def Build(self, a, nod, st, dr):
if nod >= len(self.aint):
return
if st == dr:
self.aint[nod] = a[st]
return
mid = int((st + dr) / 2)
self.Build(a, 2 * nod, st, mid)
self.Build(a, 2 * nod + 1, mid + 1, dr)
self.aint[nod] = max(self.aint[2 * nod], self.aint[2 * nod + 1])
def Update(self, nod, st, dr, p, x):
if st > p or dr < p:
return
if st == dr:
self.aint[nod] = x
return
mid = int((st + dr) / 2)
self.Update(2 * nod, st, mid, p, x)
self.Update(2 * nod + 1, mid + 1, dr, p, x)
self.aint[nod] = max(self.aint[2 * nod], self.aint[2 * nod + 1])
def Query(self, nod, st, dr, l, r):
if st > r or dr < l:
return 0
if l <= st and dr <= r:
return self.aint[nod]
mid = int((st + dr) / 2)
q1 = self.Query(2 * nod, st, mid, l, r)
q2 = self.Query(2 * nod + 1, mid + 1, dr, l, r)
return max(q1, q2)
def main():
f = open("arbint.in", "r")
g = open("arbint.out", "w")
s = f.readline()
b = s.split()
n = int(b[0])
m = int(b[1])
s = f.readline()
b = s.split()
a = [0]
for i in b:
a.append(int(i))
arbint = Arbore(a, n)
for i in range(m):
s = f.readline()
b = s.split()
op = int(b[0])
x = int(b[1])
y = int(b[2])
if op == 0:
g.write(str(arbint.Query(1, 1, n, x, y)) + "\n")
else:
arbint.Update(1, 1, n, x, y)
f.close()
g.close()
if __name__ == '__main__':
main()