#include <algorithm>
using namespace std;
#define DIM 100005
int aint[3*DIM];
int n,q,maxim;
inline int max (int a,int b)
{
if (a>b)
return a;
return b;
}
void update (int nod,int st,int dr,int poz,int val)
{
if (st==dr)
aint[nod]=val;
else
{
int mij;
mij=(st+dr)/2;
if (poz<=mij)
update (2*nod,st,mij,poz,val);
else
update (2*nod+1,mij+1,dr,poz,val);
aint[nod]=max (aint[2*nod],aint[2*nod+1]);
}
}
void read ()
{
int i,x;
scanf ("%d%d",&n,&q);
for (i=1; i<=n; ++i)
{
scanf ("%d",&x);
update (1,1,n,i,x);
}
}
void query (int nod,int st,int dr,int in,int sf)
{
if (in<=st && dr<=st)
maxim=max (maxim,aint[nod]);
else
{
int mij;
mij=(st+dr)/2;
if (in<=mij)
query (2*nod,st,mij,in,sf);
if (sf>mij)
query (2*nod+1,mij+1,dr,in,sf);
}
}
void solve ()
{
int i,tip,x,y;
for (i=1; i<=q; ++i)
{
scanf ("%d%d%d",&tip,&x,&y);
if (tip==0)
{
maxim=0;
query (1,1,n,x,y);
printf ("%d\n",maxim);
}
else if (tip==1)
update (1,1,n,x,y);
}
}
int main ()
{
freopen ("arbint.in","r",stdin);
freopen ("arbint.out","w",stdout);
read ();
solve ();
return 0;
}