#include <fstream>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int n,m,i,x,op,a,b;
int arbore[200002];
int frunza[100001];
void init(int poz, int val)
{
int pozc, st, dr;
pozc=1;
st=1;
dr=n;
while(true)
{
arbore[pozc]=max(arbore[pozc], val);
if(st==dr)
{
frunza[st]=pozc;
return;
}
if(poz>(st+dr)/2)
{
st=(st+dr)/2+1;
pozc=2*pozc+1;
}
else
{
dr=(st+dr)/2;
pozc=2*pozc;
}
}
}
int qu(int xt, int yt, int xc, int yc, int poz)
{
if(xt==xc && yt==yc)
return arbore[poz];
if(yt<=(xc+yc)/2)
return qu(xt, yt, xc, (xc+yc)/2, 2*poz);
if(xt>(xc+yc)/2)
return qu(xt, yt, (xc+yc)/2+1, yc, 2*poz+1);
return max(qu(xt, (xc+yc)/2, xc, (xc+yc)/2, 2*poz),
qu((xc+yc)/2+1, yt, (xc+yc)/2+1, yc, 2*poz+1));
}
void upd(int poz, int val)
{
int pozc=frunza[poz];
arbore[pozc]=val;
pozc/=2;
while(true)
{
arbore[pozc]=max(arbore[2*pozc], arbore[2*pozc+1]);
if(pozc==1)
break;
pozc/=2;
}
}
int main()
{
fin>>n>>m;
for(i=1;i<=n;i++)
{
fin>>x;
init(i, x);
}
//for(i=1;i<=2*n;i++)
// cout<<arbore[i]<<' ';
for(i=1;i<=m;i++)
{
fin>>op>>a>>b;
if(op==0)
{
fout<<qu(a,b, 1, n, 1)<<'\n';
}
else
upd(a, b);
}
return 0;
}