#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
#include<set>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
struct {int st; int dr; int val;}p[250001];
int a[100001],x,n,m,i,y,t,q1,q2,b;
void creare(int nod,int q, int n)
{
p[nod].st=q;
p[nod].dr=n;
if(q!=n)
{
int mij=(q+n)/2;
creare(nod*2,q,mij);
creare(nod*2+1,mij+1,n);
}
}
void modifica(int i1, int nod, int mod)
{
if(p[nod].st>=i1 && p[nod].dr<=i1)
{
p[nod].val=mod;
y=nod;
}
else
{
int mij=(p[nod].st+p[nod].dr)/2;
if(mij>=i1)
modifica(i1, 2*nod, mod);
else if(mij<i1)
modifica(i1, 2*nod+1, mod);
}
}
void maximizeaza(int y)
{
if(p[y/2].val!=max(p[(y/2)*2].val,p[((y/2)*2)+1].val) && (y/2))
{
p[y/2].val=max(p[(y/2)*2].val,p[((y/2)*2)+1].val);
maximizeaza(y/2);
}
}
void cauta(int q1, int q2, int nod, set<int> &pi)
{
if(p[nod].st>=q1 && p[nod].dr<=q2)
{
pi.insert(p[nod].val);
}
else
{
int mij=(p[nod].st+p[nod].dr)/2;
if(mij>=q1)
cauta(q1,q2, 2*nod,pi);
else if(mij<q2)
cauta(q1,q2, 2*nod+1,pi);
pi.insert(max(p[2*nod].val,p[2*nod+1].val));
}
}
int main ()
{
set<int> pi;
in>>n>>m;
creare(1,1,n);
for(i=1;i<=n;i++)
{
in>>a[i];
modifica(i,1,a[i]);
maximizeaza(y);
}
for(i=1;i<=m;i++)
{
in>>t>>q1>>q2;
b=0;
if(t==0)
{
pi.clear();
cauta(q1,q2,1,pi);
out<<*pi.begin()<<"\n";
}
else
{
modifica(q1,1,q2);
maximizeaza(y);
}
}
return 0;
}