#include <iostream>
#include <vector>
#include <list>
#include <fstream>
using namespace std;
int Min;
int createarbint(int a[], int arbint[], int left, int right, int pos){
if(left == right) {
arbint[pos] = a[left];
return a[left];
}
int mid = (left+right)/2;
int l1 = createarbint(a, arbint, left, mid, pos*2);
int l2 = createarbint(a, arbint, mid+1, right, pos*2+1);
arbint[pos] = l1 < l2 ? l2 : l1;
return arbint[pos];
}
int findMax(int a[], int arbint[], int left, int right, int ileft, int iright, int pos = 0){
int mid = (left+right)/2;
if (left >= ileft && right <= iright)
return arbint[pos];
if(right < ileft || left > iright) return Min;
int m1 = findMax(a, arbint, left, mid, ileft, iright, pos*2);
int m2 = findMax(a, arbint, mid+1, right, ileft, iright, pos*2+1);
return m1 > m2 ? m1 : m2;
}
void changeVal(int arbint[], int target, int val, int left, int right, int pos){
if(left == right){
if(left == target) {
arbint[pos] = val;
}
return;
}
int mid = (left+right)/2, newPos = pos*2;
if(target<=mid) changeVal(arbint, target, val, left, mid, newPos);
else changeVal(arbint, target, val, mid+1, right, newPos+1);
arbint[pos] = arbint[newPos] > arbint[newPos+1] ? arbint[newPos] : arbint[newPos+1];
}
int main(){
ifstream f("arbint.in");
ofstream g("arbint.out");
int n, m;
f>>n>>m;
int a[n+1], i=1;
while(i<n+1){
f>>a[i++];
if(Min > a[i-1]) Min = a[i-1];
}
a[0] = Min;
int l = 1;
while(l<n){
l*=2;
}
l = l*2;
int arbint[l];
for(int i=0; i<l; i++){
arbint[i] = Min;
}
createarbint(a, arbint, 1, n, 1);
int b, c, d;
while(m>0){
f>>b>>c>>d;
switch(b){
case 0: {
g<<findMax(a, arbint, 1, n, c, d, 1)<<endl;
break;
}
case 1: {
changeVal(arbint, c, d, 1, n, 1);
break;
}
default: {
break;
}
}
m--;
}
f.close();
g.close();
return 0;
}