#include <iostream>
#include <fstream>
using namespace std;
int v[100001];
int s[400001];
int n,i,m,a,b,c;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
void maketree(int i, int p, int q)
{
if(p==q)
{
s[i]=v[p];
}
else
{
int m=(p+q)/2;
maketree(i*2,p,m);
maketree(i*2+1,m+1,q);
s[i]=max(s[2*i],s[2*i+1]);
}
}
int maxx(int i,int p,int q,int ls, int rd)
{
if(ls<=p && q<=rd){
return s[i];
}else if(ls>q || rd<p) return 0;
else{
int mij=(p+q)/2;
int a=maxx(i*2,p,mij,ls,rd);
int b=maxx(i*2+1,mij+1,q,ls,rd);
return max(a,b);
}
//return 0;
}
void update(int i, int p, int q, int a)
{
if(p==q)
s[i]=v[p];
else
{
int m=(p+q)/2;
if(a<=m)
update(2*i,p,m,a);
else update(2*i+1,m+1,q,a);
s[i]=max(s[2*i],s[2*i+1]);
}
}
int main()
{
fin>>n>>m;
for(i=1;i<=n;i++)
fin>>v[i];
maketree(1,1,n);
for(i=1;i<=m;i++)
{
fin>>c>>a>>b;
if(c==0)
fout<<maxx(1,1,n,a,b)<<endl;
else
{
v[a]=b;
update(1,1,n,a);
}
}
return 0;
}