#include <fstream>
#include <algorithm>
using namespace std;
int N, M;
int arbore[500004];
void update(int i, int x, int mni, int mxi, int ia) {
if(mni>=mxi) {
arbore[ia] = x;
return;
}
int mid = (mni+mxi)/2;
if(i<=mid)
update(i, x, mni, mid, ia*2);
else
update(i, x, mid+1, mxi, ia*2+1);
arbore[ia] = max(arbore[2*ia], arbore[2*ia+1]);
}
void update(int i, int x) {
update(i, x, 1, N, 1);
}
int query(int a, int b, int mni, int mxi, int ia) {
if(mni>=mxi)
return arbore[ia];
int mid=(mni+mxi)/2, v1=0, v2=0;
if((a>=mni&&a<=mid) || (b>=mni&&b<=mid))
v1=query(a, b, mni, mid, ia*2);
if((a>=mid+1&&a<=mxi) || (b>=mid+1&&b<=mxi))
v2=query(a, b, mid+1, mxi, ia*2+1);
return max(v1, v2);
}
int query(int a, int b) {
return query(a, b, 1, N, 1);
}
int main() {
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int i, p, a, b;
cin>>N>>M;
for(i=1; i<=N; i++) {
cin>>p;
update(i, p);
}
for(i=1; i<=M; i++) {
cin>>p>>a>>b;
if(p==0)
cout << query(a, b)<<"\n";
if(p==1)
update(a, b);
}
return 0;
}