#include<bits/stdc++.h>
using namespace std;
using ll = long long;

template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }

#define FOR(i,a,b) for(ll i=(a);i<(b);++i)
#define ALL(v) (v).begin(), (v).end()
#define p(s) cout<<(s)<<endl
#define p2(s, t) cout << (s) << " " << (t) << endl
#define br() p("")
#define pn(s) cout << (#s) << " " << (s) << endl
#define p_yes() p("Yes")
#define p_no() p("No")

const ll mod = 1e9 + 7;
const ll inf = 1e18;

template < typename T >
void vprint(T &V){
	for(auto v : V){
    	cout << v << " ";
	}
	cout << endl;
}

// ofstream of;

struct SegmentTree{
    vector<ll> A;
    ll N; // node num
 
    // 初期化
    SegmentTree(ll size){
        N = _powerOfTwo(size); //2べき
        ll initial_value = (1LL<<31)-1LL;
        A.resize(N * 2, initial_value); // 木なので2倍必要
    }

    void update(ll i, ll x){
        int index = N + i - 1; // 葉のインデックス
        A[index] = x;
        // 親にも反映
        while(index > 0){
            ll min0 = A[index];
            ll min1;
            if(index%2==0){
                min1 = A[index-1];
            }else{
                min1 = A[index+1];
            }

            ll parent = (index-1) / 2;
            A[parent] = min(min0, min1);
            index = parent;
        }
    }

    bool is_power_of_two(ll v){
        return !(v & (v-1));
    }
   
    void DebugPrintTree(){
        // of << "tree" << endl;
        // FOR(i, 0, 2*N-1){
        //     if(i!=0 && is_power_of_two(i+1)){
        //         of << endl;
        //     }
        //     of << A[i] << ' ';
        // }
        // of << endl;
    }
 
    // 引数以上の2のべき乗 5=>8
    ll _powerOfTwo(int n){
        ll ret = 1;
        while(ret < n){
            ret *= 2;
        }
        return ret;
    }
 
    // 区間[a,b)の総和。ノードk = [l,r) に着目している
    ll _rangeMin(int a, int b, int k, int l, int r){
        //cout << "_rangeSum() " << a << " " << b << " " << k << " " << l << " " << r << endl;
 
        // 重ならない
        if(r <= a || b <= l){
            return inf;
        }
        // 内包する
        else if(a <= l && r <= b){
            return A[k];
        }
        // 重なる部分もある
        else{
            ll center = (l+r) / 2;
            // 左下の子
            ll min0 = _rangeMin(a, b, 2*k+1, l, center);
            // 右下の子
            ll min1 = _rangeMin(a, b, 2*k+2, center, r);
            return min(min0, min1);
        }
    }
 
    // [a, b) までの和
    // 半開区間
    ll RangeMin(int a, int b){
        //cout << "range sum [" << a << "," << b << ")" << endl;
        return _rangeMin(a, b, 0, 0, N);
    }
};

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);

    // input
    ll N, Q;
    cin >> N >> Q;

    // of.open("log.txt");

    auto st = SegmentTree(N);

    FOR(i, 0, Q){
        ll com, x, y;
        cin >> com >> x >> y;

        // update
        if(com==0){
            st.update(x, y);
        }
        // find
        else{
            ll mi = st.RangeMin(x, y+1);
            p(mi);
        }

        // of << endl;
        // of << "query " << com << " " << x << " " << y << endl;
        // of << "i:" << i << endl;
        // st.DebugPrintTree();
        // if(com==1){
        //     of << "=>" << st.RangeMin(x, y+1) << endl;
        // }
    }

    
    return 0;
}


Measured memory_bytes: 4864