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: Runtime Error)

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cassert>
#define FOR(i,a,b) for(int i=(a);i<(b);i++)
#define REP(i,n) FOR(i,0,n)
#define rep(i,n) FOR(i,0,n)
#define DEBUG(x) cout<<#x<<": "<<x<<endl
#define vint vector<int>
#define vdouble vector<double>
#define vstring vector<string>
using namespace std;

#include<map>
#include<set>
#include<queue>

typedef long long ll;
typedef unsigned long long ull;

// const int MAX_N = 1000000;
const int INFTY = (1 << 21); // 2097152
// const ll INFTY = (1LL << 60);
const ll MD = 1000000007LL;
// fprintf(stderr, "%d %lld \n", x, xll);

// segtree
// memeory error??
const int MAX_N = 100000; // 1 << 20; // > 10^6

class SegTree{

public:

	int n;
	int dat[2 * MAX_N - 1];
	int dummy = 2147483647; // (1 << 31) - 1;

	SegTree(int _n){
		init(_n);
	}

	void init(int n_){
		n = 1;
		while(n < n_) n *=2;
		// initialize
		rep(i, 2 * n - 1) dat[i] = dummy;
	}

	void update(int k, int a){
		// update from bottom
		k += n-1;
		dat[k] = a;
		while(k > 0){
			k = (k - 1) / 2;
			dat[k] = min(dat[k*2+1], dat[k*2+2]);
		}
	}

	// min of [a, b)
	int query(int a, int b){
		return _query(a, b, 0, 0, n);
	}

	// min of [a, b)
	// node k, corresponding [l, r)
	int _query(int a, int b, int k, int l, int r){
		if(r <= a || b <= l) return dummy;
		if(a <= l && r <= b) return dat[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);
		}
	}
};


int N, Q;
int main() {
	cin >> N >> Q;

	SegTree ST(N);

	rep(q, Q){
		int c, x, y;
		cin >> c >> x >> y;

		if(c == 0){
			// update
			ST.update(x, y);
		}
		else{
			// find
			cout << ST.query(x, y+1) << endl;
		}
	}
}