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)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using static System.Console;
 
class Program
{
    static void Main()
    {
        var nq = ReadLine().Split().Select(int.Parse).ToArray();
        var n = nq[0];
        var q = nq[1];
        var c = 1;
        for (int i = 1; i < n; i <<= 1)
        {
            c = i;
        }
        c <<= 1;
 
        var s = new SegTree(c);
        for (int i = 0; i < q; i++)
        {
            var line = ReadLine().Split().Select(int.Parse).ToArray();
            if (line[0] == 0) s.Update(line[1], line[2]);
            else WriteLine(s.Query(line[1], line[2] + 1));
        }
    }
}
 
public class SegTree
{
    int[] buffer;
    int N;
 
    public SegTree(int cap)
    {
        buffer = new int[cap * 2 - 1];
        for (int i = 0; i < buffer.Length; i++)
        {
            buffer[i] = int.MaxValue;
        }
        N = cap;
    }
 
    public void Update(int index, int value)
    {
        index += N - 1;
        buffer[index] = value;
        while (index > 0)
        {
            index = (index - 1) / 2;
            buffer[index] = Math.Min(buffer[index * 2 + 1], buffer[index * 2 + 2]);
        }
    }
 
    public int Query(int l, int r)
    {
        var y = int.MaxValue;
        l += N - 1;
        r += N - 1;
        while (l < r)
        {
            if ((l & 1) == 0)
            {
                y = Math.Min(y, buffer[l]);
            }
            if ((r & 1) == 0)
            {
                y = Math.Min(y, buffer[r - 1]);
            }
            l /= 2;
            r = (r - 1) / 2;
        }
        return y;
    }
}