#include <fstream>
using namespace std;
#define MAX 100050
int st[4*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];
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]);
}
}
int x,y;
void update(int nod,int s,int e,int x,int y)
{
int m;
if (s==e)
{
a[s]=y;
st[nod]=y;
return;
}
m=(s+e)/2;
if (x<=m) update(nod<<1,s,m,x,y);
else update((nod<<1)+1,m+1,e,x,y);
st[nod]=max(st[nod<<1],st[(nod<<1)+1]);
}
int querry(int nod, int s,int e,int x,int y)
{
int m,x1,x2;
x1=x2=0;
if (x<=s and e<=y)
return st[nod];
else if(e<x or s>y)return 0;
m=(s+e)/2;
x1=querry(nod<<1,s,m,x,y);
x2=querry((nod<<1)+1,m+1,e,x,y);
return max(x1,x2);
}
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;
}