#include <fstream>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int n,m,i,x,op,a,b;
int arbore[400002];
int frunza[100001];
void init(int poz, int val)
{
///merge de sus in jos
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)
{
///x tinta, y tinta, x curent, y curent, poz in vector in momentul de fata
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)
{
///merge de jos in sus
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<=m; i++)
{
fin>>op>>a>>b;
if(op==0)
fout<<qu(a,b, 1, n, 1)<<'\n';
else
upd(a, b);
}
return 0;
}