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

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

template <typename T>
struct segtree {
	int n;
	vector<T> tree;
	T def = numeric_limits<T>::max(), none = numeric_limits<T>::max();
	
	segtree(int n_) {
		for (n = 1; n < n_; n *= 2) {
			
		}
		tree.assign(2 * n, def);
	}
	
	T get(int index) {
		assert(0 <= index && index < n);
		return tree[n + index];
	}
	
	T merge(T a, T b) {
		return min(a, b);
	}
	
	void update(int index, T x) {
		assert(0 <= index && index < n);
		tree[index += n] = x;
		for (index /= 2; index; index /= 2) {
			tree[index] = merge(tree[2 * index], tree[2 * index + 1]);
		}
	}
	
	T query(int a, int b, int index, int l, int r) {
		assert(0 <= a && a < b && b <= n);
		assert(0 <= l && l < r && r <= n);
		if (r <= a || b <= l) {
			return none;
		}
		if (a <= l && r <= b) {
			return tree[index];
		}
		T puni = query(a, b, 2 * index, l, (l + r) / 2);
		T muni = query(a, b, 2 * index + 1, (l + r) / 2, r);
		return merge(puni, muni);
	}
	
	T query(int l, int r) {
		assert(0 <= l && l < r && r <= n);
		return query(l, r, 1, 0, n);
	}
};

int main() {
	int n, q;
	cin >> n >> q;
	segtree<int> seg(n);
	for (int i = 0; i < q; i++) {
		bool f;
		int x, y;
		cin >> f >> x >> y;
		if (f) {
			cout << seg.query(x, y + 1) << endl;
		} else {
			seg.update(x, y);
		}
	}
	return 0;
}