#include <bits/stdc++.h>
using namespace std;
int n,v[(1<<17)+30],aint[2*(1<<17)+30],m;
void buildd () {
for(int i=n;i<2*n;++i)
aint[i]=v[i-n+1];
for(int i=n-1;i>0;--i)
aint[i]=max(aint[2*i],aint[2*i+1]);
}
void updatee (int poz,int nr) {
int ind=n+poz-1;
aint[ind]=nr;
while(ind!=1) {
ind=ind/2;
aint[ind]=max(aint[2*ind],aint[2*ind+1]);
}
aint[1]=max(aint[2],aint[3]);
}
int querrys (int st,int dr,int cst, int cdr,int indexx) {
if(cst>=st && cdr<=dr)
return aint[indexx];
else {
int rez=0,mij=(cst+cdr)/2;
if(st<=mij)
rez=max(rez,querrys(st,dr,cst,mij,indexx*2));
if(dr>mij)
rez=max(rez,querrys(st,dr,mij+1,cdr,indexx*2+1));
return rez;
}
}
int main () {
int nr1,nr2,q,i;
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d", &n, &m);++m;
for(int i=1;i<=n;++i)
scanf("%d", &v[i]);
for(i=1;(i<<1)<n;i<<=1);
n=(i<<1);
buildd();
while(--m) {
scanf("%d%d%d", &q, &nr1, &nr2);
if(q==0)
printf("%d\n", querrys(nr1,nr2,1,n,1));
else
updatee(nr1,nr2);
}
return 0;
}