#include<iostream>
#include<fstream>
using namespace std;
const int maxx=400020;
int n,m,i,x,arbint[maxx],j,tip,a,b,k,max1[3];
void update(int nod,int left,int right)
{
int mij;
if(left==right)
{
arbint[nod]=x;
return;
}
else
{
mij=(left+right)/2;
if(i<=mij)
update(2*nod,left,mij);
else
update(2*nod+1,mij+1,right);
arbint[nod]=max(arbint[2*nod],arbint[2*nod+1]);
}
}
void find(int nod,int left,int right)
{
int mij;
if(a<=left&&b>=right)
{
max1[++k]=arbint[nod];
return;
}
else
{
mij=(left+right)/2;
if(a<=mij)
find(2*nod,left,mij);
if(b>mij)
find(2*nod+1,mij+1,right);
}
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d\n",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&x);
update(1,1,n);
}
for(j=1;j<=m;j++)
{
scanf("%d %d %d\n",&tip,&a,&b);
if(tip==0)
{
k=0;
find(1,1,n);
printf("%d\n",max(max1[1],max1[2]));
max1[1]=max1[2]=0;
}
else
{
i=a;
x=b;
update(1,1,n);
}
}
return 0;
}