#include <stdio.h>
long i,m,n,x,a,b,arbInt[410000],maxx,loc,valoare,st,fn;
long max(long x,long y)
{if(x<y)return y;else return x;}
inline void add(long nod, long stanga, long dreapta)
{if (stanga == dreapta)
{arbInt[nod] = valoare;return;}
int median = (stanga + dreapta) / 2;
if (loc <= median) add(nod * 2, stanga, median);
else add(nod * 2 + 1, median + 1, dreapta);
arbInt[nod] = max(arbInt[nod * 2], arbInt[nod * 2 + 1]);
}
inline long query(long nod, long stanga, long dreapta)
{ if(st<=stanga&&dreapta<=fn)
return arbInt[nod];
long median=(stanga+dreapta)/2;
long minim=0;
if(st<=median)
minim=max(minim,query(2*nod,stanga,median));
if(median<fn)
minim=max(minim,query(2*nod+1,median+1,dreapta));
return minim;
}
int main()
{freopen("arbint.in","r",stdin);freopen("arbint.out","w",stdout);
fscanf(stdin,"%ld%ld",&n,&m);
for(i=1;i<=n;++i){fscanf(stdin,"%ld",&x);loc=i;valoare=x;add(1,1,n);}
for(i=1;i<=m;++i)
{fscanf(stdin,"%ld%ld%ld",&x,&a,&b);
if(x){loc=a;valoare=b;add(1,1,n);}
else {st=a;fn=b;maxx=query(1,1,n);fprintf(stdout,"%ld\n",maxx);}
}
fclose(stdin);fclose(stdout);
return 0;
}