#include<fstream.h>
using namespace std;
long n,m,v[600000],op,a,b,x,poz,maxi;
void arbore(long nod,long st,long dr)
{
if(st==dr)
{ v[nod]=x;
return;
}
long mij=(st+dr)/2;
if(poz<=mij) arbore(2*nod,st,mij);
else arbore(2*nod+1,mij+1,dr);
if(v[2*nod]>v[2*nod+1]) v[nod]=v[2*nod];
else v[nod]=v[2*nod+1];
}
void cauta(long nod,long st,long dr)
{
if(a<=st && dr<=b)
{ if(maxi<v[nod]) maxi=v[nod];
return ;
}
long mijl=(st+dr)/2;
if(a<=mijl) cauta(nod*2,st,mijl);
else cauta(nod*2+1,mijl+1,dr);
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%ld%ld",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%ld",&x);
poz=i;
arbore(1,1,n);
}
for(int i=1;i<=m;i++)
{ scanf("%ld%ld%ld",&op,&a,&b);
if(op==0)
{
maxi=-1;
cauta(1,1,n);
printf("%ld\n",maxi);
}
else
{
poz=a;
x=b;
arbore(1,1,n);
}
}
return 0;
}