#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int arbore[400000];
void update(int nod,int jos,int sus,int val,int poz)
{
if(sus==jos)
{
arbore[nod]=val;
return;
}
int mij=(sus+jos)/2;
if(poz<=mij)
update(nod*2,jos,mij,val,poz);
else
update(nod*2+1,mij+1,sus,val,poz);
arbore[nod]=max(arbore[nod*2],arbore[nod*2+1]);
}
int query(int nod,int jos,int sus,int a,int b)
{
if(a<=jos&&b>=sus)
{
return arbore[nod];
}
int mij=(sus+jos)/2;
int x=0;
int y=0;
if(a<=mij)
x=query(2*nod,jos,mij,a,b);
if(b>mij)
y=query(2*nod+1,mij+1,sus,a,b);
return max(x,y);
}
int main()
{
int i,n,m,x;
f>>n>>m;
for(i=1;i<=n;i++)
{
f>>x;
update(1,1,n,x,i);
}
for(i=1;i<=m;i++)
{
bool t;
int a,b;
f>>t>>a>>b;
if(t)
update(1,1,n,b,a);
else
{
g<<query(1,1,n,a,b)<<"\n";
}
}
}