#include <stdio.h>
#include <stdlib.h>
#define MAXN 131072
int v[MAXN], arb[MAXN * 2];
void update(int i, int val, int n){
v[i] = val;
i = i + n - 1;
arb[i] = val;
i /= 2;
while(1 <= i){
if(arb[i * 2] < arb[i * 2 + 1]){
arb[i] = arb[i * 2 + 1];
}else{
arb[i] = arb[i * 2];
}
i /= 2;
}
}
int query(int a, int b, int st, int dr, int i, int niv){
int aux[2];
if((a <= st) && (dr <= b)){
return arb[i];
}else{
if((st <= b) && (a <= dr)){
aux[0] = query(a, b, st, dr - niv, i * 2, niv / 2);
aux[1] = query(a, b, st + niv, dr, i * 2 + 1, niv / 2);
if(aux[0] < aux[1]){
return aux[1];
}else{
return aux[0];
}
}else{
return 0;
}
}
}
int main()
{
FILE *fin, *fout;
int n, i, a, b, q, p, op;
fin = fopen("arbint.in", "r");
fscanf(fin, "%d%d", &n, &q);
for(i = 0; i < n; i++){
fscanf(fin, "%d", &v[i]);
}
p = 1;
while(p < n){
p *= 2;
}
n = p;
for(i = 2 * n - 1; n <= i; i--){
arb[i] = v[i - n];
}
for(i = n - 1; 0 < i; i--){
if(arb[i * 2] < arb[i * 2 + 1]){
arb[i] = arb[i * 2 + 1];
}else{
arb[i] = arb[i * 2];
}
}
fout = fopen("arbint.out", "w");
for(i = 0 ; i < q; i++){
fscanf(fin, "%d%d%d", &op, &a, &b);
if(op == 0){
fprintf(fout, "%d\n", query(a, b, 1, n, 1, n / 2));
}else{
update(a, b, n);
}
}
fclose(fin);
fclose(fout);
return 0;
}