#include <fstream>
#define Nmax 100005
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int arb[4*Nmax],a[Nmax],n,m;
void Read()
{
int i;
fin>>n>>m;
for(i=1;i<=n;++i)
fin>>a[i];
}
int Build(int l,int r,int nod)
{
if(r==l){
arb[nod]=a[l];
return arb[nod];
}
int val1,val2,mid;
mid=l+(r-l)/2;
val1=Build(l,mid,2*nod);
val2=Build(mid+1,r,2*nod+1);
arb[nod]=max(val1,val2);
return arb[nod];
}
void Update(int l,int r,int nod,int i,int val)
{
if(r==l){ a[l]=val; arb[nod]=val; return;}
int mid=l+(r-l)/2;
if(i<=mid) Update(l,mid,2*nod,i,val);
else Update(mid+1,r,2*nod+1,i,val);
arb[nod]=max(arb[2*nod],arb[2*nod+1]);
}
int Query(int l,int r,int nod,int st,int dr)
{
if(l>=st&&r<=dr)return arb[nod];
if(l>dr||r<st)return 0;
int mid=l+(r-l)/2;
int val1=Query(l,mid,2*nod,st,dr);
int val2=Query(mid+1,r,2*nod+1,st,dr);
return max(val1,val2);
}
int main()
{
Read();
Build(1,n,1);
int i,cod,x,y;
/*for(i=1;i<=4*n;i++)fout<<arb[i]<<" ";
fout<<"\n";*/
for(i=1;i<=m;i++)
{
fin>>cod>>x>>y;
if(cod==0)fout<<Query(1,n,1,x,y)<<"\n";
else Update(1,n,1,x,y);
}
return 0;
}