#include<fstream>
#define nmax 300010
long n,a,b,o,m;
long t[nmax];
ifstream f("arbint.in");
ofstream g("arbint.out");
long max(long a,long b)
{
if (a>b)
return a;
return b;
}
void update(long k,long st,long dr,long a,long b)
{
long mij;
if (st==dr)
{
t[k]=b;
return;
}
mij=(st+dr)/2;
if (a<=mij)
update(2*k,st,mij,a,b);
else update(2*k+1,mij+1,dr,a,b);
t[k]=max(t[2*k],t[2*k+1]);
}
void read()
{
f>>n>>m;
long i;
for (i=1;i<=n;i++)
{
f>>a;
update(1,1,n,i,a);
}
}
long interv(long k,long st,long dr,long a,long b)
{
long mij,fs=0,fd=0;
if (a<=st && b>=dr)
return t[k];
mij=(st+dr)/2;
if (a<=mij)
fs=interv(2*k,st,mij,a,b);
if (b>mij)
fd=interv(2*k+1,mij+1,dr,a,b);
return max(fs,fd);
}
int main()
{
read();
long i;
for (i=1;i<=m;i++)
{
f>>o>>a>>b;
if (!o)
{
g<<interv(1,1,n,a,b)<<"\n";
}
else {
update(1,1,n,a,b);
}
}
return 0;
}