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