#include <iostream>
#include <fstream>
#include <vector>
#define nmax 100000
using namespace std;
unsigned n,m,nr,arb[2*nmax+2];
unsigned maxim(unsigned a, unsigned b)
{
if(a>b)return a;
return b;
}
void update(unsigned nod, unsigned st, unsigned dr,unsigned pos, unsigned val)
{
if(st>=pos && dr<=pos)
{
arb[nod]=val;
}
else
{
unsigned mijl=(st+dr)/2;
if(pos<=mijl)
update(nod*2,st, mijl, pos, val);
else
update(nod*2+1,mijl+1, dr, pos, val);
arb[nod] = maxim(arb[nod*2],arb[nod*2+1]);
}
}
unsigned query(unsigned nod, unsigned st, unsigned dr,unsigned a,unsigned b)
{
if(st>=a && dr<=b)
{
return arb[nod];
}
else
{
unsigned mijl=(st+dr)/2;
if(a<=mijl)
query(nod*2,st, mijl, a, b);
else
query(nod*2+1,mijl+1, dr, a, b);
}
}
int main()
{
unsigned i,t,a,b;
ifstream f("arbint.in");
ofstream g("arbint.out");
f>>n>>m;
for(i=1;i<=n;i++)
{
f>>nr;
update(1,1,n,i,nr);
}
for(i=1;i<=m;i++)
{
f>>t>>a>>b;
if(t==0)g<<query(1,1,n,a,b)<<'\n';
else update(1,1,n,a,b);
}
return 0;
}