#include<fstream.h>
long v[100005], a[270000];
void constr (int nod, int st, int dr, int b, int val)
{
if (st>=dr) v[nod]=val;
else
{
if (b<=(st+dr)/2) constr(2*nod,st,(st+dr)/2,b,val);
if (b>(st+dr)/2) constr(2*nod+1,(st+dr)/2+1,dr,b,val);
if (v[nod*2+1]<v[2*nod]) v[nod]=v[2*nod];
else v[nod]=v[nod*2+1];
}
}
int max (int st, int dr, int b1, int b2,int nod)
{
if (b1<=st && dr<=b2) return v[nod];
else
{
long mij=(st+dr)/2;
long max1=0, max2=0;
if (b1<=mij) max1=max(st,mij,b1,b2,2*nod);
if (b2>mij) max2=max(mij+1,dr,b1,b2,2*nod+1);
if (max1<max2) return max2;
else return max1;
}
}
int main()
{
long n,i,m,nr,val;
ifstream f ("arbint.in");
f>>n>>m;
for (i=1;i<=n;i++)
{
f>>val;
constr(1,1,n,i,val);
}
ofstream g("arbint.out");
long a1,b;
for (i=1;i<=m;i++)
{
f>>nr>>a1>>b;
if (nr==1) constr(1,1,n,a1,b);
else g<<max(1,n,a1,b,1)<<'\n';
}
f.close();
g.close();
return 0;
}