#include <fstream>
using namespace std;
int arbint[400055], mx, i, n, m, a, b, c;
void query(int st, int dr, int s1, int s2, int act)
{
if((s1<=st && st<=s2) && (s1<=dr && dr<=s2))
{
mx=max(mx, arbint[act]);
return;
}
int mij=(st+dr)/2;
if((st<=s1 && s1<=mij) || (st<=s2 && s2<=mij))
{
query(st, mij, s1, s2, 2*act);
}
if((mij<s1 && s1<=dr) || (mij<s2 && s2<=dr))
{
query(mij+1, dr, s1, s2, 2*act+1);
}
}
void update(int st, int dr, int poz, int val, int act)
{
int mij=(st+dr)/2;
if(st==poz && dr==poz)
{
arbint[act]=val;
return;
}
if(st<=poz && poz<=mij)
update(st, mij, poz, val, 2*act);
if(mij<poz && poz<=dr)
update(mij+1, dr, poz, val, 2*act+1);
arbint[act]=max(arbint[2*act], arbint[2*act+1]);
}
int main()
{
ifstream f("arbint.in");
ofstream g("arbint.out");
f>>n>>m;
for(i=1; i<=n; i++)
{
f>>a;
update(1, n, i, a, 1);
}
for(i=1; i<=m; i++)
{
f>>a>>b>>c;
if(a==0)
{
mx=-1;
query(1, n, b, c, 1);
g<<mx<<"\n";
}
if(a==1)
{
update(1, n, b, c, 1);
}
}
}