#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int N,M,v[100003],AI[400003];
void Create_Segment_tree(int a,int b,int n)
{
if( a == b )
AI[n] = v[a];
else
{
int mij = (a+b)/2;
Create_Segment_tree(a,mij,n*2);
Create_Segment_tree(mij+1,b,n*2+1);
AI[n] = max(AI[n*2],AI[n*2+1]);
}
}
void Update(int a, int b,int n,int poz,int val)
{
if( a == b )
AI[n] = val;
else
{
int mij = (a+b)/2;
if( poz <= mij )
Update(a,mij,n*2,poz,val);
else
Update(mij+1,b,n*2+1,poz,val);
AI[n] = max(AI[n*2],AI[n*2+1]);
}
}
int Query(int a,int b,int n,int l,int r)
{
if( a == l && b == r )
return AI[n];
else
{
int mij = (a+b)/2;
if( r <= mij )
return Query(a,mij,n*2,l,r);
else
if( l > mij )
return Query(mij+1,b,n*2+1,l,r);
else
return max(Query(a,mij,n*2,l,mij),Query(mij+1,b,n*2+1,mij+1,r));
}
}
int main()
{
int q,a,b;
f>>N>>M;
for(int i = 1 ; i <= N ; i++)
f>>v[i];
Create_Segment_tree(1,N,1);
for(int i = 1 ; i <= M ; i++)
{
f>>q>>a>>b;
if( q == 0 )
g<<Query(1,N,1,a,b)<<'\n';
else
Update(1,N,1,a,b);
}
return 0;
}