/*
　　　  ∧＿∧　やあ
　　 （´・ω・｀)　　　　　/　　　　　ようこそ、バーボンハウスへ。
　　 ／∇y:::::＼　　　 [￣]　　　　　このテキーラはサービスだから、まず飲んで落ち着いて欲しい。
　　 |:⊃:|:::::|　　　|──|
￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣|　うん、「また」なんだ。済まない。
￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣|￣　  仏の顔もって言うしね、謝って許してもらおうとも思っていない。
￣￣￣￣￣￣￣￣￣￣￣￣￣￣／|
　　　　∇　∇　∇　∇　　　／.／|　　　でも、この提出を見たとき、君は、きっと言葉では言い表せない
　　　　┴　┴　┴　┴　／ ／　  |　　　「ときめき」みたいなものを感じてくれたと思う。
￣￣￣￣￣￣￣￣￣￣|／　　  |　　　殺伐としたコンテストの中で、そういう気持ちを忘れないで欲しい
￣￣￣￣￣￣￣￣￣￣　　　　 |　　　そう思って、この提出を投げたんだ。
　　　(⊆⊇)　(⊆⊇)　(⊆⊇)　　|
　    ||　　 ||　　||　　|　　　 じゃあ、判定を聞こうか。
　　.／|＼　／|＼ ／|＼
*/

#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <array>
#include <bitset>
#include <climits>
#include <cmath>
#include <cstdio>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <string>
#include <vector>
using namespace std;
#define fst first
#define snd second
#define ALL(obj) (obj).begin(),(obj).end()
#define debug(x) cerr << #x << " -> " << x << " (line:" << __LINE__ << ")" << '\n';
#define debugpair(x, y) cerr << "(" << #x << ", " << #y << ") -> (" << x << ", " << y << ") (line:" << __LINE__ << ")" << '\n';
typedef long long lint;
typedef priority_queue<int> p_que;
typedef priority_queue<int, vector<int>, greater<int>> p_que_rev;
const lint INF = INT_MAX;
const lint LINF = LLONG_MAX;
const lint MOD = 1000000000 + 7;
const double EPS = 1e-9;
const double PI = acos(-1);
const int di[]{0, -1, 0, 1, -1, -1, 1, 1};
const int dj[]{1, 0, -1, 0, 1, -1, -1, 1};

int main()
{
    int n, q;
    scanf("%d %d", &n, &q);
    const int init_value = 2147483647;
    int b_size = floor(sqrt(n));
    int b_num = n / b_size;
    if(b_num * b_size < n){
        b_num++;
    }
    vector<int> a(b_num * b_size);
    vector<int> b(b_num);
    for (int i=0; i<b_num*b_size; ++i){
        a[i] = init_value;
    }
    for (int i=0; i<b_num; ++i){
        b[i] = init_value;
    }
    int com, x, y, query_ans;
    int backet_num, b_l, b_r;
    for (int query=0; query<q; ++query){
        scanf("%d %d %d", &com, &x, &y);
        // update
        if(com == 0){
            a[x] = y;
            backet_num = x / b_size;
            if(b[backet_num] >= y){
                b[backet_num] = y;
            }
            else {
                b_l = backet_num * b_size;
                b[backet_num] = a[b_l];
                b_r = b_l + b_size;
                for (int i=b_l+1; i<b_r; ++i){
                    if(b[backet_num] > a[i]){
                        b[backet_num] = a[i];
                    }
                }
            }
        }
        // find
        else {
            ++y;
            query_ans = init_value;
            b_l = x / b_size + 1;
            b_r = y / b_size;
            for (int i=x; i<min(y, b_l * b_size); ++i){
                query_ans = min(query_ans, a[i]);
            }
            for (int i=b_l; i<b_r; ++i){
                query_ans = min(query_ans, b[i]);
            }
            for (int i=max(x, b_r * b_size); i<y; ++i){
                query_ans = min(query_ans, a[i]);
            }
            printf("%d\n", query_ans);
        }
        /*
        cout << "query: " << query << endl;
        for (int i=0; i<b_num*b_size; ++i){
            cout << a[i] << " ";
        }
        cout << endl;
        for (int i=0; i<b_num; ++i){
            cout << b[i] << " ";
        }
        cout << endl;
        */
    }
    return 0;
}


Measured memory_bytes: 3368