import math

class RangeMinimumQuery:

    """

    RangeMinimumQuery by Segment Tree

    query:

    1. update(i, val): update i-th value to val

    2. query(low, high): find minimun value in [low, high)

    time complexity: O(log n)

    space complexity: O(2n)    

    """

    def __init__(self, N, INF=float('inf')):

        self.N = 1 << math.ceil(math.log(N, 2))

        self.INF = INF

        self.segtree = [self.INF] * (self.N * 2 - 1)



    def update(self, i, val):

        i += self.N - 1

        self.segtree[i] = val

        while i > 0:

            i = (i - 1) // 2

            self.segtree[i] = min(self.segtree[2*i+1], self.segtree[2*i+2])



    def query(self, low, high, k=0, left=0, right=-1):

        if right == -1: right = self.N

        if right <= low or high <= left: return self.INF



        if low <= left and right <= high:

            return self.segtree[k]

        else:

            mid = (left + right) // 2

            return min(self.query(low, high, 2*k+1, left, mid), 

                       self.query(low, high, 2*k+2, mid, right))



N, Q = list(map(int, input().split()))

rmq = RangeMinimumQuery(N, INF=(1<<31)-1)

for _ in range(Q):

    com, x, y = list(map(int, input().split()))

    if com == 0:

        rmq.update(x, y)

    elif com == 1:

        print((rmq.query(x, y+1)))
class SegmentTree:

    """Segment Tree (Point Update & Range Query)



    Query

        1. update(i, val): update i-th value to val

        2. query(low, high): find f(value) in [low, high)



    Complexity

        time complexity: O(log n)

        space complexity: O(n)

    """



    def __init__(self, N, f, default):

        self.N = 1 << (N-1).bit_length()

        self.default = default

        self.f = f

        self.segtree = [self.default] * ((self.N << 1) - 1)



    @classmethod

    def create_from_array(cls, arr, f, default):

        N = len(arr)

        self = cls(N, f, default)

        for i in range(N):

            self.segtree[self.N - 1 + i] = arr[i]



        for i in reversed(list(range(self.N - 1))):

            self.segtree[i] = self.f(

                self.segtree[(i << 1) + 1], self.segtree[(i << 1) + 2])

        return self



    def update(self, i, val):

        i += self.N - 1

        self.segtree[i] = val

        while i > 0:

            i = (i - 1) >> 1

            self.segtree[i] = self.f(

                self.segtree[(i << 1)+1], self.segtree[(i << 1)+2])



    def query(self, low, high):

        # query [l, r)

        low, high = low + self.N, high + self.N

        ret = self.default

        while low < high:

            if low & 1:

                ret = self.f(ret, self.segtree[low-1])

                low += 1

            if high & 1:

                high -= 1

                ret = self.f(ret, self.segtree[high-1])

            low, high = low >> 1, high >> 1

        return ret





def yosupo():

    # https://judge.yosupo.jp/problem/staticrmq

    _, Q = list(map(int, input().split()))

    A = [int(x) for x in input().split()]

    rmq = SegmentTree.create_from_array(A, min, 10**9)

    for _ in range(Q):

        l, r = list(map(int, input().split()))

        print((rmq.query(l, r)))





def aoj():

    # https://onlinejudge.u-aizu.ac.jp/courses/library/3/DSL/2/DSL_2_A

    N, Q = list(map(int, input().split()))

    default = (1 << 31) - 1

    rmq = SegmentTree(N, min, default)

    for _ in range(Q):

        com, x, y = list(map(int, input().split()))

        if com == 0:

            rmq.update(x, y)

        else:

            print((rmq.query(x, y+1)))





if __name__ == '__main__':

    # yosupo()

    aoj()



import math


class RangeMinimumQuery:
    """
    RangeMinimumQuery by Segment Tree
    query:
    1. update(i, val): update i-th value to val
    2. query(low, high): find minimun value in [low, high)
    time complexity: O(log n)
    space complexity: O(2n)
    """

    def __init__(self, N, INF=float("inf")):
        self.N = 1 << math.ceil(math.log(N, 2))
        self.INF = INF
        self.segtree = [self.INF] * (self.N * 2 - 1)

    def update(self, i, val):
        i += self.N - 1
        self.segtree[i] = val
        while i > 0:
            i = (i - 1) // 2
            self.segtree[i] = min(self.segtree[2 * i + 1], self.segtree[2 * i + 2])

    def query(self, low, high, k=0, left=0, right=-1):
        if right == -1:
            right = self.N
        if right <= low or high <= left:
            return self.INF
        if low <= left and right <= high:
            return self.segtree[k]
        else:
            mid = (left + right) // 2
            return min(
                self.query(low, high, 2 * k + 1, left, mid),
                self.query(low, high, 2 * k + 2, mid, right),
            )


N, Q = list(map(int, input().split()))
rmq = RangeMinimumQuery(N, INF=(1 << 31) - 1)
for _ in range(Q):
    com, x, y = list(map(int, input().split()))
    if com == 0:
        rmq.update(x, y)
    elif com == 1:
        print((rmq.query(x, y + 1)))

class SegmentTree:
    """Segment Tree (Point Update & Range Query)
    Query
        1. update(i, val): update i-th value to val
        2. query(low, high): find f(value) in [low, high)
    Complexity
        time complexity: O(log n)
        space complexity: O(n)
    """

    def __init__(self, N, f, default):
        self.N = 1 << (N - 1).bit_length()
        self.default = default
        self.f = f
        self.segtree = [self.default] * ((self.N << 1) - 1)

    @classmethod
    def create_from_array(cls, arr, f, default):
        N = len(arr)
        self = cls(N, f, default)
        for i in range(N):
            self.segtree[self.N - 1 + i] = arr[i]
        for i in reversed(list(range(self.N - 1))):
            self.segtree[i] = self.f(
                self.segtree[(i << 1) + 1], self.segtree[(i << 1) + 2]
            )
        return self

    def update(self, i, val):
        i += self.N - 1
        self.segtree[i] = val
        while i > 0:
            i = (i - 1) >> 1
            self.segtree[i] = self.f(
                self.segtree[(i << 1) + 1], self.segtree[(i << 1) + 2]
            )

    def query(self, low, high):
        # query [l, r)
        low, high = low + self.N, high + self.N
        ret = self.default
        while low < high:
            if low & 1:
                ret = self.f(ret, self.segtree[low - 1])
                low += 1
            if high & 1:
                high -= 1
                ret = self.f(ret, self.segtree[high - 1])
            low, high = low >> 1, high >> 1
        return ret


def yosupo():
    # https://judge.yosupo.jp/problem/staticrmq
    _, Q = list(map(int, input().split()))
    A = [int(x) for x in input().split()]
    rmq = SegmentTree.create_from_array(A, min, 10**9)
    for _ in range(Q):
        l, r = list(map(int, input().split()))
        print((rmq.query(l, r)))


def aoj():
    # https://onlinejudge.u-aizu.ac.jp/courses/library/3/DSL/2/DSL_2_A
    N, Q = list(map(int, input().split()))
    default = (1 << 31) - 1
    rmq = SegmentTree(N, min, default)
    for _ in range(Q):
        com, x, y = list(map(int, input().split()))
        if com == 0:
            rmq.update(x, y)
        else:
            print((rmq.query(x, y + 1)))


if __name__ == "__main__":
    # yosupo()
    aoj()

-import math - - -class RangeMinimumQuery: -    """ -    RangeMinimumQuery by Segment Tree -    query: -    1. update(i, val): update i-th value to val -    2. query(low, high): find minimun value in [low, high) -    time complexity: O(log n) -    space complexity: O(2n) +class SegmentTree: +    """Segment Tree (Point Update & Range Query) +    Query +        1. update(i, val): update i-th value to val +        2. query(low, high): find f(value) in [low, high) +    Complexity +        time complexity: O(log n) +        space complexity: O(n) -    def __init__(self, N, INF=float("inf")): -        self.N = 1 << math.ceil(math.log(N, 2)) -        self.INF = INF -        self.segtree = [self.INF] * (self.N * 2 - 1) +    def __init__(self, N, f, default): +        self.N = 1 << (N - 1).bit_length() +        self.default = default +        self.f = f +        self.segtree = [self.default] * ((self.N << 1) - 1) + +    @classmethod +    def create_from_array(cls, arr, f, default): +        N = len(arr) +        self = cls(N, f, default) +        for i in range(N): +            self.segtree[self.N - 1 + i] = arr[i] +        for i in reversed(list(range(self.N - 1))): +            self.segtree[i] = self.f( +                self.segtree[(i << 1) + 1], self.segtree[(i << 1) + 2] +            ) +        return self -            i = (i - 1) // 2 -            self.segtree[i] = min(self.segtree[2 * i + 1], self.segtree[2 * i + 2]) - -    def query(self, low, high, k=0, left=0, right=-1): -        if right == -1: -            right = self.N -        if right <= low or high <= left: -            return self.INF -        if low <= left and right <= high: -            return self.segtree[k] -        else: -            mid = (left + right) // 2 -            return min( -                self.query(low, high, 2 * k + 1, left, mid), -                self.query(low, high, 2 * k + 2, mid, right), +            i = (i - 1) >> 1 +            self.segtree[i] = self.f( +                self.segtree[(i << 1) + 1], self.segtree[(i << 1) + 2] +    def query(self, low, high): +        # query [l, r) +        low, high = low + self.N, high + self.N +        ret = self.default +        while low < high: +            if low & 1: +                ret = self.f(ret, self.segtree[low - 1]) +                low += 1 +            if high & 1: +                high -= 1 +                ret = self.f(ret, self.segtree[high - 1]) +            low, high = low >> 1, high >> 1 +        return ret -N, Q = list(map(int, input().split())) -rmq = RangeMinimumQuery(N, INF=(1 << 31) - 1) -for _ in range(Q): -    com, x, y = list(map(int, input().split())) -    if com == 0: -        rmq.update(x, y) -    elif com == 1: -        print((rmq.query(x, y + 1))) + +def yosupo(): +    # https://judge.yosupo.jp/problem/staticrmq +    _, Q = list(map(int, input().split())) +    A = [int(x) for x in input().split()] +    rmq = SegmentTree.create_from_array(A, min, 10**9) +    for _ in range(Q): +        l, r = list(map(int, input().split())) +        print((rmq.query(l, r))) + + +def aoj(): +    # https://onlinejudge.u-aizu.ac.jp/courses/library/3/DSL/2/DSL_2_A +    N, Q = list(map(int, input().split())) +    default = (1 << 31) - 1 +    rmq = SegmentTree(N, min, default) +    for _ in range(Q): +        com, x, y = list(map(int, input().split())) +        if com == 0: +            rmq.update(x, y) +        else: +            print((rmq.query(x, y + 1))) + + +if __name__ == "__main__": +    # yosupo() +    aoj()