#include <stdio.h>
#define INF "arbint.in"
#define OUF "arbint.out"
#define MAX(a,b) (a>b)?(a):(b)
const int TMAX=200100;
int val,a,b,segt[TMAX]={0};
void insert(int nod,int st,int dr)
{
if(a<=st&&dr<=b) segt[nod]=val;
else
{
int mij;
mij=(st+dr)/2;
if(a<=mij) insert(2*nod,st,mij);
if(b>mij) insert(2*nod+1,mij+1,dr);
segt[nod]=MAX(segt[2*nod],segt[2*nod+1]);
}
}
void query(int nod,int st,int dr)
{
if(a<=st&&dr<=b) val=MAX(val,segt[nod]);
else
{
int mij;
mij=(st+dr)/2;
if(a<=mij) query(2*nod,st,mij);
if(b>mij) query(2*nod+1,mij+1,dr);
}
}
int main()
{
FILE *in,*out;
in=fopen(INF,"r");
out=fopen(OUF,"w");
int i,x,y,z,n,m;
fscanf(in,"%d%d",&n,&m);
for(i=1;i<=n;++i)
{
fscanf(in,"%d",&val);
a=b=i;
insert(1,1,n);
}
for(i=1;i<=m;++i)
{
fscanf(in,"%d%d%d",&x,&y,&z);
if(!x)
{
a=y;b=z;val=0;
query(1,1,n);
fprintf(out,"%d\n",val);
}
else
{
a=b=y;
val=z;
insert(1,1,n);
}
}
fclose(in);fclose(out);
return 0;
}