#include <fstream>
#define INF 1000000007
using namespace std;
int v[100005];
const int N=1<<18;
int arbint[N];
ifstream cin("arbint.in");
ofstream cout("arbint.out");
void constructie(int p,int a,int b)
{
if(a==b)
{
cin>>arbint[p];
return;
}
int maxx=(a+b)/2,fs=2*p,fd=2*p+1;
constructie(fs,a,maxx);
constructie(fd,maxx+1,b);
arbint[p]=max(arbint[fs],arbint[fd]);
}
int interogare(int p,int st,int dr,int a,int b)
{
if(a<=st && dr<=b)
{
return arbint[p];
}
int m=(st+dr)/2;
int fs=p*2;
int fd=p*2+1;
int rez_st=-INF,rez_dr=-INF;
if(a<=m)
{
rez_st=interogare(fs,st,m,a,b);
}
if(m+1<=b)
{
rez_dr=interogare(fd,m+1,dr,a,b);
}
return max(rez_st,rez_dr);
}
void actualizare(int p,int st,int dr,int poz,int val)
{
if(st==dr)
{
arbint[p]=val;
return;
}
int m=(st+dr)/2,fs=2*p,fd=2*p+1;
if(poz<=m)
{
actualizare(fs,st,m,poz,val);
}
else
{
actualizare(fd,m+1,dr,poz,val);
}
arbint[p]=max(arbint[fs],arbint[fd]);
}
int main()
{
int n,Q,op,a,b;
cin>>n>>Q;
constructie(1,1,n);
for(int i=1;i<=Q;i++)
{
cin>>op;
if(op==0)
{
cin>>a>>b;
cout<<interogare(1,1,n,a,b)<<'\n';
}
else
{
int poz,val;
cin>>poz>>val;
actualizare(1,1,n,poz,val);
}
}
return 0;
}