#include <fstream>
#define NMAX 100000
using namespace std;
FILE *fin,*fout;
void update(int,int,int,int,int);
int maxim(int,int);
void query(int,int,int,int,int);
int n,m,v[2*NMAX];
int caz,mij;
int maxi,start,finish;
int main()
{
int i,x,a,b;
fin=fopen("arbint.in","r");
fout=fopen("arbint.out","w");
fscanf(fin,"%d%d",&n,&m);
for(i=1;i<=n;i++)
{
fscanf(fin,"%d",&x);
update(1,i,x,1,n);
}
for(i=1;i<=m;i++)
{
fscanf(fin,"%d%d%d",&caz,&a,&b);
if(caz==0)
{
maxi = -1;
start = a, finish = b;
query(1,a,b,1,n);
fprintf(fout,"%d\n", maxi);
}
else // caz=1;
{
update(1,a,b,1,n);
}
}
return 0;
}
int maxim(int a,int b)
{
if(a>b)
return a;
return b;
}
void update(int nod,int pos,int val,int st,int dr)
{
if(st==dr)
{
v[nod]=val;
}
else
{
mij=(st+dr)/2;
if(pos<=mij) update(2*nod,pos,val,st,mij);
else update(2*nod+1,pos,val,mij+1,dr);
v[nod]=maxim(v[2*nod],v[2*nod+1]);
}
}
void query(int nod,int start, int finish, int left, int right)
{
if ( start <= left && right <= finish )
{
if ( maxi <v[nod] ) maxi = v[nod];
return;
}
int div = (left+right)/2;
if ( start <= div ) query(2*nod,start,finish,left,div);
if ( div < finish ) query(2*nod+1,start,finish,div+1,right);
}