#include <vector>
#include <functional>
using namespace std;

int const inf = (1LL<<31) - 1;

/*
  Segment Tree
  区間に対する処理を O(log(n)) で行う
  下の例は RMQ

  コンストラクタ : binary_heap( 要素数 )
*/

#define L_CHILD(n)  (((n)<<1)+1)
#define R_CHILD(n)  (((n)<<1)+2)
#define PARERNT(n)  (((n)-1)>>1)
template<typename T>
struct segment_tree {
    vector<T> dat;
    int n;
    segment_tree(int size) {
        n = 1;
        while (n < size) n <<= 1;
        dat.assign(n << 1, inf);
    }

    const T& operator[](int i) const { return dat[i + n - 1]; }
    T& operator[](int i) { return dat[i + n - 1]; }

    void update(int k, const T& a){
        k += n - 1;
        dat[k] = a;
        while (k) {
            k = PARERNT(k);
            dat[k] = min(dat[L_CHILD(k)], dat[R_CHILD(k)]);
        }
    }

    const T & query(int a, int b, int k = 0, int l = 0, int r = -1) const {
        if (r == -1) r = n;
        if (a <= l && r <= b){
            // [l, r) ⊂ [a, b)
            return dat[k];
        } else if (r <= a || b <= l){
            // [l, r) ∩ [a, b) = ?
            return inf;
        } else {
            // [l, r) ∩ [a, b) ≠ ?
            int center = (l + r) / 2;
            int vl = query(a, b, L_CHILD(k), l, center);
            int vr = query(a, b, R_CHILD(k), center, r);
            return min(vl, vr);
        }
    }
};

#include <cstdio>
#define loop(i,a,b) for(int i=(a);i<int(b);i++)
#define rep(i,b) loop(i,0,b)
int main(){
    int n,q;
    scanf("%d%d",&n,&q);
    segment_tree<int> t(n);
    rep(i,q){
        int c,x,y;
        scanf("%d%d%d",&c,&x,&y);
        if(c==0){
            t.update(x,y);
        }else{
            printf("%d\n",t.query(x,y+1));
        }
    }
}