using System;
using System.Collections.Generic;
using System.Linq;



namespace CSharpSample01
{
    //最小セグメント
    class SegmentTree
    {
        //セグメント木の配列
        //親:(k-1)/2 子:2k+1, 2k+2
        int[] tree;
        int N;  //元の配列の2の累乗サイズ N >= n
        int size = 0;  //treeのサイズ
        const int MAX = 2147483647;
        
        //元の配列のサイズnからセグメント木のサイズを決定する
        public SegmentTree(int n)
        {
            N = 1;
            while (n > N) N *= 2;
            size = 2 * N - 1;
            tree = (new int[size]).Select(x => MAX).ToArray();
        }

        //セグメント木のサイズを決定し、配列内の値で初期化
        //O(Nlog(N))
        public SegmentTree(int n, int[] origin)
        {
            N = 1;
            while (n > N) N *= 2;
            size = 2 * N - 1;
            tree = new int[size];
            int origin_ind = 0;
            for(int i = N - 1; i < size; i++)
            {
                if(origin_ind < n)
                {
                    tree[i] = origin[origin_ind];
                    //その都度更新
                    UpdateTree(origin_ind, origin[origin_ind]);
                    origin_ind++;
                }
                else
                {
                    tree[i] = MAX;
                }                
            }         
        }

        //元の配列のnumber番目(0_indexed)の値をvalに変更
        public void UpdateTree(int number, int val)
        {
            int ind = N - 1 + number;
            tree[ind] = val;
            while(ind != 0)
            {
                if(ind % 2 == 0) tree[(ind - 1) / 2] = Math.Min(tree[ind], tree[ind - 1]);
                else tree[(ind - 1) / 2] = Math.Min(tree[ind], tree[ind + 1]);
                ind = (ind - 1) / 2;
            }
        }

        //leftとrightは0_indexed
        public int GetMinimum(int left, int right)
        {
            return Recur_District(left, right, 0, 0, N - 1);
        }

        public int Recur_District(int left, int right, int ind, int cur_l, int cur_r)
        {
            //対象区間が要求区間と重ならない
            if (right < cur_l || cur_r < left) return MAX;
            //対象区間が要求区間に完全に含まれる
            if (left <= cur_l && cur_r <= right) return tree[ind];
            //対象区間が要求区間と一部だけ重なる(右と左の子区間について)
            else return Math.Min(Recur_District(left, right, 2 * ind + 1, cur_l, (cur_l + cur_r) / 2),
              Recur_District(left, right, 2 * ind + 2, (cur_l + cur_r) / 2 + 1, cur_r));
        }

        //セグメント木の要素を表示
        public void ShowTree()
        {
            Console.WriteLine("Tree:" + string.Join(" ", tree));
        }
        
    }
    

    
    class Program
    {
        
        static void Main(string[] args)
        {
            int[] data = Console.ReadLine().Split(' ').Select(x => int.Parse(x)).ToArray();
            int N = data[0];
            int Q = data[1];

            SegmentTree sg = new SegmentTree(N);

            for (int i = 0; i < Q; i++)
            {
                data = Console.ReadLine().Split(' ').Select(x => int.Parse(x)).ToArray();
                if (data[0] == 0) sg.UpdateTree(data[1], data[2]);
                else if (data[0] == 1) Console.WriteLine(sg.GetMinimum(data[1], data[2]));
            }
            
        }
    }

}


Measured memory_bytes: 25124