/**
*/
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int nmax=1e5 + 5;
const int inf=1e9 + 5;
int n,m,t,a,b;
int v[nmax],ai[6*nmax];
void create(int st,int dr,int nod)
{
if(st==dr)
{
ai[nod]=v[st];
return;
}
int mid=(st+dr)>>1;
int stnou=2*nod;
int drnou=stnou +1;
create(st,mid,stnou);
create(mid+1,dr,drnou);
ai[nod]=max(ai[stnou],ai[drnou]);
}
void update(int st,int dr,int a,int b,int nod)
{
if(st==dr)
{
ai[nod]=b;
return;
}
int mid=(st+dr)>>1;
int stnou=2*nod;
int drnou=stnou +1;
if(a<=mid)
update(st,mid,a,b,stnou);
else
update(mid+1,dr,a,b,drnou);
ai[nod]=max(ai[stnou],ai[drnou]);
}
int maxim(int st,int dr,int a,int b,int nod)
{
if(a<=st && b>=dr)
{
return ai[nod];
}
int sol=-inf;
int mid=(st+dr)>>1;
int stnou=2*nod;
int drnou=stnou +1;
if(a<=mid)
sol=max(sol,maxim(st,mid,a,b,stnou));
if(b>mid)
sol=max(sol,maxim(mid+1,dr,a,b,drnou));
return sol;
}
void read_solve()
{
fin>>n>>m;
for(int i=1;i<=n;i++)
{
fin>>v[i];
}
create(1,n,1);
while(m)
{
fin>>t>>a>>b;
if(t==1)
{
update(1,n,a,b,1);
}
if(t==0)
{
fout<<maxim(1,n,a,b,1);
}
m--;
}
}
int main()
{
read_solve();
return 0;
}