#include <fstream>
using namespace std;
int arbint[500055], mx, i, n, m, a, b, c;
void query(int st, int dr, int s1, int s2, int act)
{
if(s1<=st && dr<=s2)
{
if(mx<arbint[act])
mx=arbint[act];
return;
}
int mij=(st+dr)/2;
if(s1<=mij)
{
query(st, mij, s1, s2, 2*act);
}
if(mij<s2)
{
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==dr)
{
arbint[act]=val;
return;
}
if(poz<=mij)
update(st, mij, poz, val, 2*act);
if(mij<poz)
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);
}
}
}