#include <algorithm>
using namespace std;
#define DIM 100005
int aint[3*DIM];
int n,q,maxim;
void update (int nod,int st,int dr,int poz,int val)
{
int mij;
if (st==dr)
aint[nod]=val;
else
{
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)
{
int mij;
if (in<=st && dr<=sf)
maxim=max (maxim,aint[nod]);
else
{
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
update (1,1,n,x,y);
}
}
int main ()
{
freopen ("arbint.in","r",stdin);
freopen ("arbint.out","w",stdout);
read ();
solve ();
return 0;
}