#include<iostream>
#include<fstream>
using namespace std;
long z(long *arb,long nod,long a,long b,long st,long dr)
{
long m=(st+dr)/2;
if(st==a&&b>dr) return arb[nod];
if(a<=m) z(arb,nod*2,a,b,st,m);
else z(arb,nod*2+1,a,b,m+1,dr);
}
long e(long *arb,long nod,long a,long b,long st,long dr)
{
long m=(st+dr)/2;
if(dr==b&&a<st) return arb[nod];
if(b<=m) e(arb,nod*2,a,b,st,m);
else e(arb,nod*2+1,a,b,m+1,dr);
}
long zero(long *arb,long a,int b,long st,long dr)
{
//cout<<z(arb,1,a,b,st,dr)<<" "<<e(arb,1,a,b,st,dr)<<"\n";
return max(z(arb,1,a,b,st,dr),e(arb,1,a,b,st,dr));
}
void unu(long *arb,long nod,long a,int b,long st,long dr)
{
long m=(st+dr)/2;
if(st==dr&&st==a) {arb[nod]=b;return;}
else if(st==dr) return;
else if(st==dr) return;
if (a<=m) unu(arb,nod*2,a,b,st,m);
else unu(arb,nod*2+1,a,b,m+1,dr);
if(arb[nod*2]>arb[nod*2+1]) arb[nod]=arb[nod*2];
else arb[nod]=arb[nod*2+1];
}
void create(long *arb,long *v,long nod,long st,long dr)
{
if(st==dr) {arb[nod]=v[st];return;}
create(arb,v,nod*2,st,(st+dr)/2);
create(arb,v,nod*2+1,(st+dr)/2+1,dr);
if(arb[nod*2]>arb[nod*2+1]) arb[nod]=arb[nod*2];
else arb[nod]=arb[nod*2+1];
}
int main()
{
ifstream f("arbint.in");
ofstream g("arbint.out");
long n,b,a,m,arb[200002],v[100001],i,k=-1;
bool o;
f>>n>>m;
for(i=1;i<=n;i++) f>>v[i];
create(arb,v,1,1,n);
for(i=1;i<=m;i++)
{
f>>o>>a>>b;
if(o) unu(arb,1,a,b,1,n);
else g<<zero(arb,a,b,1,n)<<"\n";
}
// for(i=1;i<=2*n-1;i++) cout<<arb[i]<<" ";
f.close();g.close();
return 0;
}