#include <stdio.h>
long a[400100];
long maxim,i,n,m,q,w,x;
int max(int e, int r)
{
if (e<r) return r;
else return e;
}
void update(int nod, int st, int dr, int poz, int x)
{
if (st==dr) a[nod]=x;
else {
int mij=(st+dr) >> 1;
if (poz<=mij) update(nod*2,st,mij,poz,x);
else update(nod*2+1,mij+1,dr,poz,x);
a[nod]=max(a[nod*2],a[nod*2+1]);
}
}
void query(int nod, int st, int dr)
{
if (q<=st&&dr<=w)
{ if (maxim<a[nod]) maxim=a[nod]; return;}
else {
int mij=(st+dr)/2;
if (q<=mij) query(nod*2,st,mij);
if (mij<w) query(nod*2+1,mij+1,dr);
}
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%ld %ld",&n , &m);
for (i=1; i<=n; ++i)
{
scanf("%ld",&x);
update(1,1,n,i,x);
}
for (i=1; i<=m; ++i)
{
scanf("%ld %ld %ld",&x,&q,&w);
if (x==0)
{ maxim=-100;
query(1,1,n);
printf("%ld\n",maxim);
}
else
update(1,1,n,q,w);
}
fclose(stdin); fclose(stdout);
return 0;
}