#include <cstdio>
#define N 132000
#define left(x) 2*(x)
#define right(x) 2*(x)+1
#define pr(x) (x)/2
struct {long st,dr,max;}sir[2*N];
long p[N];
long n;
void modifica(long a,long b)
{long i=p[a],max;
sir[i].max=b;
for (i=pr(i);i;i=pr(i))
{max=0;
if(sir[i].st<sir[i].dr&&sir[left(i)].max>max)
{max=sir[left(i)].max;}
if(sir[i].st<sir[i].dr&&sir[right(i)].max>max)
{max=sir[right(i)].max;}
sir[i].max=max;
}
}
void creeaza(long nod,long st,long dr)
{sir[nod].st=st;sir[nod].dr=dr;
if(st==dr)
{p[st]=nod;
}
else if(sir[nod].st<sir[nod].dr)
{creeaza(left(nod),st,(dr+st)/2);
creeaza(right(nod),(st+dr)/2+1,dr);
}
}
long max(long nod, long st,long dr)
{if(st<=sir[nod].st&&sir[nod].dr<=dr)
{return sir[nod].max;}
else
{long m=0,t;
if(sir[nod].st<sir[nod].dr&&st<=sir[left(nod)].dr)
{if(m<(t=max(left(nod),st,dr)))
{m=t;
}
}
if(sir[nod].st<sir[nod].dr&&dr>=sir[right(nod)].st)
{if(m<(t=max(right(nod),st,dr)))
{m=t;
}
}
return m;
}
}
int main ()
{long i,j,m,flag,a,b,c;
FILE *fin=fopen ("arbint.in","r");
FILE *fout=fopen("arbint.out","w");
FILE *bug=fopen("debug.txt","w");
fscanf(fin,"%ld%ld",&n,&m);
creeaza(1,1,n);
for (i=1;i<=n;i++)
{fscanf(fin,"%ld",&c);
modifica(i,c);
}
for (i=1;i<=m;i++)
{fscanf(fin,"%ld%ld%ld",&flag,&a,&b);
if(flag==0)
{fprintf(fout,"%ld\n",max(1,a,b));
}
else
{modifica(a,b);//el de pe pozitia a devine b
/*for (j=1;j<2*n+10;j++)
{fprintf(bug,"%ld %ld %ld ",sir[j].st,sir[j].dr,sir[j].max);
}
fprintf(bug,"\n");*/
}
}
fclose(fout);
return 0;
}