#include <iostream>
#include<stdio.h>
using namespace std;
long int n,m,maxim=-1,arbore[300000],a,b,val,poz;
void interogare(long int, long int, long int);
void actualizare(long int, long int, long int);
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%ld %ld",&n,&m);
long int i;
for(i=1; i<=n; i++)
{
long long int aux;
cin>>aux;
//constructie(1,i,aux,1,n);
poz=i; val=aux;
actualizare(1,1,n);
}
for(;m;m--)
{
maxim=-1;
long int x,y,z;
scanf("%d %ld %ld",&x,&y,&z);
//cin>>x>>y>>z;
if(!x)
{
a=y; b=z;
interogare(1,1,n);
printf("%lld\n",maxim);
}
//cout<<interogare(1,1,n,y,z)<<'\n';
else{ poz=y; val=z;
actualizare(1,1,n);
}
}
return 0;
}
inline void interogare(long int nod, long int stg, long int drp)
{
if(a<=stg && drp<=b){if(arbore[nod]>maxim)maxim=arbore[nod];}
else{
long long int mij=(stg+drp)/2;
if(a<=mij)interogare(2*nod,stg,mij);
if(mij<b)interogare(2*nod+1,mij+1,drp);
}
}
inline void actualizare(long int nod, long int stg, long int drp)
{
if(stg==drp && stg==poz){ arbore[nod]=val; }
else
{
long int mij=(stg+drp)/2;
if(poz>mij) actualizare(2*nod+1,mij+1,drp);
else actualizare(2*nod,stg,mij);
if(arbore[2*nod]>arbore[2*nod+1])arbore[nod]=arbore[2*nod];
else arbore[nod]=arbore[2*nod+1];
}
}