Problem:
Range Minimum Query (RMQ)

Write a program which manipulates a sequence A = {a0, a1, . . . , an-1} with the following operations:

find(s, t): report the minimum element in as, as+1, . . . ,at.

update(i, x): change ai to x.

Note that the initial values of ai (i = 0, 1, . . . , n−1) are 231-1.

Input

n q
com0 x0 y0
com1 x1 y1
...
comq−1 xq−1 yq−1

In the first line, n (the number of elements in A) and q (the number of queries) are given. Then, q queries are given where com represents the type of queries. '0' denotes update(xi, yi) and '1' denotes find(xi, yi).

Output

For each find operation, print the minimum element.

Constraints

1 ≤ n ≤ 100000

1 ≤ q ≤ 100000

If comi is 0, then 0 ≤ xi < n, 0 ≤ yi < 231-1.

If comi is 1, then 0 ≤ xi < n, 0 ≤ yi < n.

Sample Input 1

3 5
0 0 1
0 1 2
0 2 3
1 0 2
1 1 2

Sample Output 1

1
2

Sample Input 2

1 3
1 0 0
0 0 5
1 0 0

Sample Output 2

2147483647
5

Solution in C++ (judge verdict: Accepted)

#include <iostream>
#include <vector>
#define INT_MAX (1<<31) - 1

using namespace std;


const int MAX_N = 1 << 17;

class SegTree{
private:
    int dat[2*MAX_N - 1];
public:
    int n;
    SegTree(int n);
    void update(int k, int a);
    int query(int a, int b, int k, int l, int r);
};

SegTree::SegTree(int n_){
    n = 1;
    // 葉の数 n を2のべき乗にする
    while(n < n_) n *= 2;
    for(int i=0; i<2*n-1; i++) dat[i] = INT_MAX;
}

// 配列arrのk番目の値をaに変更
void SegTree::update(int k, int a){
    // arr[k]に対応する葉の節点
    k += n - 1;
    // 葉をaに更新
    dat[k] = a;
    // 木を登りながら各節点の最小値を更新
    while (k > 0){
        k = (k - 1) / 2;
        dat[k] = min(dat[2*k+1], dat[2*k+2]);
    }
}

// [a, b) の最小値を求める
int SegTree::query(int a, int b, int k, int l, int r){
    if (r <= a || b <= l) return INT_MAX;
    if (a <= l && r <= b) return dat[k];
    else{
        // vl:左の子の値, vr:右の子の値 をそれぞれ再帰的に求める
        int vl = query(a, b, 2*k+1, l, (l+r)/2);
        int vr = query(a, b, 2*k+2, (l+r)/2, r);
        return min(vl, vr);
    }
}

int main(){
    int n, q; cin >> n >> q;
    vector<int> ans;
    SegTree s(n);
    for(int i=0; i<q; i++){
        int com, x, y;
        cin >> com >> x >> y;
        if (com == 0){
            s.update(x, y);
        }else{
            ans.push_back(s.query(x, y+1, 0, 0, s.n));
        }
    }
    for(int i=0; i<ans.size(); i++) cout << ans[i] << endl;

}