#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
const int N=100005;
int a[N], arbore[4*N];
int n, m;
void build1(int nod, int st, int dr)
{
if(st==dr)
{
arbore[nod]=a[st];
}else
{
int mij=(st+dr)/2;
build1(nod*2, st, mij);
build1(nod*2+1, mij+1, dr);
arbore[nod]=max(arbore[nod*2],arbore[nod*2+1]);
}
}
void update(int nod, int st, int dr, int poz, int val)
{
if(st==dr)
{
arbore[nod]=val;
}
else
{
int mij=(st+dr)/2;
if(poz<=mij)
update(nod*2, st, mij, poz, val);
else
update(nod*2+1, mij+1, dr, poz, val);
arbore[nod]=max(arbore[nod*2], arbore[nod*2+1]);
}
}
int query(int nod, int st, int dr, int qst, int qdr)
{
if(qst<=st&&qdr>=dr)
return arbore[nod];
else
{
int mij=(st+dr)/2;
if(qdr<=mij)
return query(nod*2, st, mij, qst, qdr);
if(mij+1<=qst)
return query(nod*2+1, mij+1, dr, qst, qdr);
return max(query(nod*2, st, mij, qst, qdr),query(nod*2+1, mij+1, dr, qst, qdr));
}
}
int main()
{
f>>n>>m;
for(int i=1; i<=n; i++)
f>>a[i];
build1(1, 1, n);
g<<endl;
while(m--)
{
int t;
f>>t;
if(t==1)
{
int poz, val;
f>>poz>>val;
update(1,1,n,poz, val);
}
else
{
int st, dr;
f>>st>>dr;
g<<query(1,1,n,st, dr)<<endl;
}
}
return 0;
}