#include <fstream>
#define NMAX 100005
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
long n,m,v[NMAX],ai[4*NMAX],x,y,mx;
bool opt;
void construieste_ai(long nod,long st,long dr);
void modifica(long nod,long st,long dr);
void calculeaza(long nod,long st,long dr);
long MAX(long a,long b){
return a>b?a:b;}
int main()
{
long i;
f>>n>>m;
for(i=1;i<=n;i++)
f>>v[i];
construieste_ai(1,1,n);
for(i=1;i<=m;i++){
f>>opt>>x>>y;
if(opt)
modifica(1,1,n);
else{
mx=0;
calculeaza(1,1,n);
g<<mx<<'\n';}}
f.close();
g.close();
return 0;
}
void construieste_ai(long nod,long st,long dr){
if(st==dr)
ai[nod]=v[st];
else{
long mij=(st+dr)/2;
construieste_ai(2*nod,st,mij);
construieste_ai(2*nod+1,mij+1,dr);
ai[nod]=MAX(ai[2*nod],ai[2*nod+1]);}}
void modifica(long nod,long st,long dr){
if(st==dr)
ai[nod]=y;
else{
long mij=(st+dr)/2;
if(x<=mij)
modifica(2*nod,st,mij);
else
modifica(2*nod+1,mij+1,dr);
ai[nod]=MAX(ai[2*nod],ai[2*nod+1]);}}
void calculeaza(long nod,long st,long dr){
if(st>=x&&dr<=y){
if(ai[nod]>mx)
mx=ai[nod];}
else{
long mij=(st+dr)/2;
if(x<=mij)
calculeaza(2*nod,st,mij);
if(y>mij)
calculeaza(2*nod+1,mij+1,dr);}}