#include <cstdio>
#define NMAX 100005
#define max(a,b) a>b?a:b
using namespace std;
int val[4*NMAX];
int n,q,st,dr,valoare,poz,type;
inline void update(int nod,int a,int b,int poz){
if (a==b)val[nod]=valoare;
else{
int m=(a+b)/2;
if (poz<=m)update(2*nod,a,m,poz);
else update(2*nod+1,m+1,b,poz);
val[nod]=max(val[2*nod],val[2*nod+1]);
}
}
inline int query(int nod,int a,int b){
if (st<=a && b<=dr)return val[nod];
else {
int m=(a+b)/2;
if (st<=m && m<dr)return max(query(2*nod,a,m),query(2*nod+1,m+1,b));
else if (st<=m)return query(2*nod,a,m);
return query(2*nod+1,m+1,b);
}
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d",&n,&q);
for (int i=1;i<=n;i++){
scanf("%d",&valoare);
update(1,1,NMAX,i);
}
for (;q;q--){
scanf("%d",&type);
if (!type){
scanf("%d %d\n",&st,&dr);
printf("%d\n",query(1,1,NMAX));
}
else{
scanf("%d %d",&poz,&valoare);
update(1,1,NMAX,poz);
}
}
fclose(stdin);
fclose(stdout);
}