import sys
def next_pow2(n):
if n <= 1:
return 1
return 1 << (n - 1).bit_length()
class SegmentTree:
def __init__(self, arr: list[int]) -> None:
biggie = 10**9
while len(arr) < next_pow2(len(arr)):
arr.append(biggie)
self.n = len(arr)
self.tree = [0] * self.n + arr
for k in range(self.n - 1, -1, -1):
self.tree[k] = min(self.tree[2 * k], self.tree[2 * k + 1])
def update(self, k: int, u: int) -> None:
k = self.n + k - 1
self.tree[k] = u
k = k // 2
while k >= 1:
prev = self.tree[k]
self.tree[k] = min(self.tree[2 * k], self.tree[2 * k + 1])
if self.tree[k] == prev:
return
k = k // 2
def min(self, a: int, b: int) -> int:
def mini_min(node: int, l: int, r: int) -> int:
if node >= len(self.tree):
return 10**9
mid = (l + r) // 2
return min(
self.tree[node] if l >= a and r <= b else 10**9,
mini_min(node * 2 + 1, mid + 1, r),
mini_min(node * 2, l, mid),
)
return mini_min(1, 1, self.n)
def main():
data = sys.stdin.buffer.read().split()
it = iter(data)
n = int(next(it))
q = int(next(it))
arr = [int(next(it)) for _ in range(n)]
queries = [(int(next(it)), int(next(it)), int(next(it))) for _ in range(q)]
# _, q = map(int, input().split())
# arr = list(map(int, input().split()))
# queries = [tuple(map(int, input().split())) for _ in range(q)]
st = SegmentTree(arr)
for op, x, y in queries:
if op == 1:
st.update(x, y)
else:
print(st.min(x, y))
main()