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++11 (judge verdict: Accepted)

#pragma warning(disable:4996)

#include "bits/stdc++.h"
using namespace std;

typedef long long ll;
#define REP(i, n) for(int i = 0;i < n;i++)
#define REPR(i, n) for(int i = n;i >= 0;i--)
#define FOR(i, m, n) for(int i = m;i < n;i++)
#define pb push_back
#define mp make_pair
#define fill(x,y) memset(x,y,sizeof(x))

const ll INF = (1ll << 60);
const int INF_CONST = (int)1e9;
const ll MOD_CONST = (ll)(1e9 + 7);

// Range Minimum Query　区間の最小値に対する処理
class SegTree {
public:
	void init(int _n, ll init_value) {
		n = 1;
		while (n < _n) n *= 2; // 要素数を2の冪乗にする
		dat.resize(2 * n - 1);
		REP(i, dat.size()) dat[i] = init_value;
		max_value = init_value;
	}

	// k番目の値をaに変更
	void update(int k, int a) {
		k += n - 1;
		dat[k] = a;
		while (k > 0) {
			k = (k - 1) / 2;
			dat[k] = min(dat[k * 2 + 1], dat[k * 2 + 2]);
		}
	}

	size_t size() { return n; }

	// [a, b)の最小値
	ll query(int a, int b) { return q_rec(a, b, 0, 0, n); }
private:
	ll q_rec(int a, int b, int k, int l, int r) {
		if (r <= a or b <= l) return max_value;
		if (a <= l and r <= b) return dat[k];
		else {
			ll vl = q_rec(a, b, k * 2 + 1, l, (l + r) / 2);
			ll vr = q_rec(a, b, k * 2 + 2, (l + r) / 2, r);
			return min(vl, vr);
		}
	}

	vector<ll> dat;
	int n;
	ll max_value;
};

int main(void)
{
	cin.tie(0); ios::sync_with_stdio(0); cout << fixed << setprecision(20);

	int N, Q; cin >> N >> Q;
	SegTree st;
	ll init_v = ((ll)1 << 31) - 1;
	st.init(N, init_v);
	REP(i, Q) {
		int c, x, y; cin >> c >> x >> y;
		if (c == 0) st.update(x, y);
		else cout << st.query(x, y+1) << endl;
	}

	return 0;
}