#include <fstream>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
const int inf=100000000;
int v[100005];
struct copac
{
int maxim;
}arb[200005];
void arbore (int nod,int st,int dr)
{
if(st==dr)
{
arb[nod].maxim=v[st];
}
else
{
int mij=(st+dr)/2;
arbore(nod*2,st,mij);
arbore(nod*2+1,mij+1,dr);
arb[nod].maxim=max(arb[nod*2].maxim,arb[nod*2+1].maxim);
}
}
int afis (int nod,int st,int dr,int poz1,int poz2)
{
if(st>=poz1 && dr<=poz2)
{
return arb[nod].maxim;
}
else
{
int stanga=inf;
int dreapta=inf;
int mij=(st+dr)/2;
if(mij<poz2)
{
dreapta=afis(nod*2+1,mij+1,dr,poz1,poz2);
}
if(mij>=poz1)
{
stanga=afis(nod*2,st,mij,poz1,poz2);
}
return max(stanga,dreapta);
}
}
void update (int nod,int st,int dr,int poz1,int val)
{
if(st==dr)
{
arb[nod].maxim=val;
return ;
}
int mij=(st+dr)/2;
if(poz1>mij)
{
update(nod*2+1,mij+1,dr,poz1,val);
}
else
{
update(nod*2,st,mij,poz1,val);
}
arb[nod].maxim = min(arb[nod*2].maxim, arb[nod*2+1].maxim);
}
int main()
{
int n,i,j,k,m,st,dr,suma,val,x;
fin>>n >> m;
for(i=1; i<=n; i++)
{
fin>>v[i];
}
arbore(1,1,n);
for(i=1; i<=m; i++)
{
fin>>x;
if(x==0)
{
fin>>st>>dr;
fout<<afis(1,1,n,st,dr)<<'\n';
}
else
{
if(x==1)
{
fin>>st>>val;
update(1,1,n,st,val);
}
}
}
return 0;
}