#include <fstream>
using namespace std;
#define MAX 100050
int st[2*MAX+5],a[MAX];
ifstream fin("arbint.in");
ofstream fout("arbint.out");
void build(int nod,int s,int e)
{
int mid;
if(s==e)st[nod]=a[s];//,fout<<nod<<" "<<s<<" "<<e<<"\n";
else
{
mid=s+e;
mid/=2;
build(2*nod,s,mid);
build(2*nod+1,mid+1,e);
st[nod]=max(st[2*nod+1],st[2*nod]);
// fout<<nod<<" "<<s<<" "<<e<<"\n";
}
}
int x,y;
void update(int nod,int s,int e,int x,int y)
{
int m;
if (s>=x && x<=e)
{
st[nod]=y;
return;
}
m=(s+e)>>1;
if (x<=m) update(nod<<1,s,m,x,y);
else update((nod<<1)+1,m+1,e,x,y);
if (st[nod<<1]<st[(nod<<1)+1]) st[nod]=st[(nod<<1)+1];
else st[nod]=st[nod<<1];
}
int querry(int nod, int s,int e,int x,int y) {
int m,x1,x2;
x1=x2=0;
if (x<=s && e<=y)
return st[nod];
m=(s+e)>>1;
if (x<=m) x1=querry(nod<<1,s,m,x,y);
if (y>m) x2=querry((nod<<1)+1,m+1,e,x,y);
if(x1==0) return x2;
if(x2==0) return x1;
if (x2>x1) x1=x2;
return x1;
}
int n,i,q,t,z;
int main()
{
fin>>n>>q;
for(i=1; i<=n; i++)
{
fin>>a[i];
// update(1,1,n,a[i],i);
}
build(1,1,n );
for(t=1; t<=q; t++)
{
fin>>z>>x>>y;
if(z==0)
{
fout<<querry(1,1,n,x,y)<<"\n";
}
else
{
update(1,1,n,x,y);
}
// for(i=1; i<=2*n-1; i++)fout<<st[i]<<" ";
// fout<<"\n";
}
return 0;
}