#include<iostream>
#include<fstream>
#define DN 400010
using namespace std;
fstream fin("arbint.in",ios::in),fout("arbint.out",ios::out);
int N,n,m,pow[DN],A[DN];
void pls()
{
int i;
pow[0]=1;
for(i=1;i<=DN;i++)
{
pow[i]=pow[i-1]*2;
if(n<=pow[i])
{
N=pow[i];
return ;
}
}
}
void build()
{
int i;
for(i=N-1;i>0;i--) A[i]=max(A[i*2],A[i*2+1]);
}
int querry(int nod,int s,int d,int a,int b)
{
if(a<=s && d<=b) return A[nod];
if(d<a || b<s) return -1;
int f1=2*nod,f2=2*nod+1,m=(s+d)/2;
return max(querry(f1,s,m,a,b), querry(f2,m+1,d,a,b));
}
void update(int nod,int s,int d,int a,int b)
{
if(a<s || d<a) return ;
if(s==d)
{
A[nod]=b;
return ;
}
int f1=2*nod,f2=2*nod+1,m=(s+d)/2;
update(f1,s,m,a,b);
update(f2,m+1,d,a,b);
A[nod]=max(A[f1],A[f2]);
}
int main()
{
int i,op,a,b;
fin>>n>>m;
pls();
for(i=1;i<=n;i++) fin>>A[N+i-1];
build();
for(i=1;i<=m;i++)
{
fin>>op>>a>>b;
if(op==0)
{
fout<<querry(1,1,N,a,b)<<"\n";
}
else
{
update(1,1,N,a,b);
}
}
}