#include<stdio.h>
#define Nmax 100002
using namespace std;
int n,m,arb[Nmax*4],element_max;
inline int max(int a,int b)
{
if(a>b)
return a;
return b;
}
inline void update(int i,int left,int right,int position,int value) // position arata pozitia elementului value,care are indicele i ,din
{ // vectorul de intrare
if(left==right)
{
arb[i]=value;
return ;
}
int mid=(left+right)/2;
if(position<=mid)
update(2*i,left,mid,position,value);
else
update(2*i+1,mid+1,right,position,value);
arb[i]=max(arb[2*i],arb[2*i+1]);
}
inline void query(int i,int left,int right,int a,int b)
{
if(a<=left&&b>=right)
{
if(arb[i]>element_max)
element_max=arb[i];
return ;
}
int mid=(left+right)/2;
if(a<=mid)
query(2*i,left,mid,a,b);
if(b>mid)
query(2*i+1,mid+1,right,a,b);
}
int main()
{
register int j,op,x,y;
FILE *c,*d;
c=fopen("arbint.in","r");
d=fopen("arbint.out","w");
fscanf(c,"%d %d",&n,&m);
for(j=1;j<=n;j++)
{
fscanf(c,"%d",&x);
update(1,1,n,j,x);
}
for(j=1;j<=m;j++)
{
fscanf(c,"%d %d %d",&op,&x,&y);
if(op==0)
{
element_max=-1;
query(1,1,n,x,y);
fprintf(d,"%d\n",element_max);
}
else
if(op==1)
update(1,1,n,x,y);
}
fclose(c);
fclose(d);
return 0;
}