#include <stdio.h>
#define IN "arbint.in"
#define OUT "arbint.out"
#define DIM 500001
FILE *fin=fopen(IN,"r");
FILE *fout=fopen(OUT,"w");
int n,m;
int arb[DIM];
int start,finish,val,pos,maximul;
inline int maxim(int,int);
void update(int,int,int);
void query(int,int,int);
int main()
{
int x,a,b;
int i;
fscanf(fin,"%d%d",&n,&m);
for(i=1;i<=n;i++)
{
fscanf(fin,"%d",&x);
pos=i;
val=x;
update(1,1,n);
}
for(i=1;i<=m;i++)
{
fscanf(fin,"%d%d%d",&x,&a,&b);
if(x==0)
{
maximul=-1;
start=a;
finish=b;
query(1,1,n);
fprintf(fout,"%d\n",maximul);
}
else
{
pos=a;
val=b;
update(1,1,n);
}
}
fclose(fin);
fclose(fout);
return 0;
}
inline int maxim(int a, int b)
{
if(a>b)
return a;
return b;
}
void update(int nod,int st,int dr)
{
if(st==dr)
{
arb[nod]=val;
return;
}
int med=(st+dr)/2;
if(pos<=med)
update(2*nod,st,med);
else
update(2*nod+1,med+1,dr);
arb[nod]=maxim(arb[2*nod],arb[2*nod+1]);
}
void query(int nod,int st,int dr)
{
if(start<=st && dr<=finish)
{
if(maximul<arb[nod])
maximul=arb[nod];
return;
}
int med=(st+dr)/2;
if(start<=med)
query(2*nod,st,med);
if(med<finish)
query(2*nod+1,med+1,dr);
}