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.Linq;
using System.Collections.Generic;

public static class Program {
    public static void Main() {
        int[]nq=Console.ReadLine().Split().Select(int.Parse).ToArray();
        int n=nq[0];
        int q=nq[1];

        int N=1;
        while(N<n)N*=2;
        n=N;
        N=2*n;
        int inf=int.MaxValue;
        int[]table=new int[N];
        for(int i=0;i<N;i++){
            table[i]=inf;
        }

        for(int t=0;t<q;t++){
            int[]query=Console.ReadLine().Split().Select(int.Parse).ToArray();
            if(query[0]==0){
                int i=query[1]+n;
                int x=query[2];
                table[i]=x;
                for(i/=2;1<=i;i/=2){
                    table[i]=Math.Min(table[i*2],table[i*2+1]);
                }
            }else{
                int l=query[1]+n;
                int r=query[2]+n+1;
                int ans=inf;
                for(;l!=r;l/=2,r/=2){
                    if(l%2==1)ans=Math.Min(ans,table[l++]);
                    if(r%2==1)ans=Math.Min(ans,table[--r]);
                }
                Console.WriteLine(ans);
            }
        }
    }
}