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 <climits>
#include <algorithm>
using namespace std;

class segmentTree{
public:
  int size; //要素数
  int* seg; //実際に値を格納する配列(初期化の際は大きさをsize*2-1で)

  //コンストラクタ segの大きさに注意
  segmentTree(int n){
    size=1;
    while(size<n) size *= 2;
    seg = new int[size*2-1];

    for(int i=0; i<size*2-1; i++) seg[i]=INT_MAX;
  }

  //k番目値をaに変更
  void update(int k, int a){
    k += size-1;
    seg[k] = a;
    //木を登りながら更新
    while(k>0){
      k = (k-1)/2;
      seg[k] = min(seg[k*2+1], seg[k*2+2]);
    }
  }

  //クエリから最小値を得るための関数
  //[a, b)の最小値を節点番号k, 区間[l, r)を指定して返す
  int query(int a, int b, int k, int l, int r){
    //もし指定した範囲が[a, b)の範囲外ならばINT_MAXを返しておく
    if(r <= a || b <= l) return INT_MAX;

    //[a, b)が[l, r)を完全に含むならば、その節点の値を返す
    if(a <= l && r <= b) return seg[k];

    else{
      int vl = query(a, b, k*2+1, l, (l+r)/2);
      int vr = query(a, b, k*2+2, (l+r)/2, r);
      return min(vl, vr);
    }

  }

  //デストラクタ
  ~segmentTree(){
    delete[] seg;
  }
};

int main(){
  int n, q; cin >> n >> q;
  segmentTree st(n);

  int ope, x, y;
  int ans[q]; int j=0;
  for(int i=0; i<q; i++){
    cin >> ope >> x >> y;
    if(ope==0) st.update(x, y);
    else ans[j++] = st.query(x, y+1, 0, 0, st.size);
  }

  for(int i=0; i<j; i++) cout << ans[i] << endl;

  return 0;
}