#include <fstream>
std::ifstream fin("arbint.in");
std::ofstream fout("arbint.out");
using std::max;
const int inf=1e9+3, nmax=1e5;
int A[5+nmax],arb[5+4*nmax],n,m;
void read()
{
fin>>n>>m;
for(int i=0;i<n;i++)
fin>>A[i];
}
void build_arb(int left,int right,int node)
{
if(right==left)
{
arb[node]=A[right];
return;
}
int next_node_left=2*node,next_node_right=next_node_left+1,mid=(left+right)>>1;
build_arb(left,mid,next_node_left);
build_arb(1+mid,right,next_node_right);
arb[node]=max(arb[next_node_left],arb[next_node_right]);
}
void up_to_date_arb(int left,int right,int node,int ind,int val)
{
if(right==left)
{
arb[node]=val;
return;
}
int next_node_left=2*node,next_node_right=next_node_left+1,mid=(left+right)>>1;
if(ind<=mid)
up_to_date_arb(left,mid,next_node_left,ind,val);
else
up_to_date_arb(1+mid,right,next_node_right,ind,val);
arb[node]=max(arb[next_node_left],arb[next_node_right]);
}
int max_arb(int left,int right,int node,int left_limit,int right_limit)
{
if(left>=left_limit && right_limit>=right)
return arb[node];
int sol=-inf,next_node_left=2*node,next_node_right=next_node_left+1,mid=(left+right)>>1;
if(left_limit<=mid)
sol=max(sol,max_arb(left,mid,next_node_left,left_limit,right_limit));
if(right_limit>mid)
sol=max(sol,max_arb(1+mid,right,next_node_right,left_limit,right_limit));
return sol;
}
void solve_and_print()
{
build_arb(0,n-1,1);
for(int i=0;i<m;i++)
{
int task,a,b;
fin>>task>>a>>b;
if(task)
up_to_date_arb(1,n,1,a,b);
else
fout<<max_arb(1,n,1,a,b)<<'\n';
}
}
int main()
{
read();
solve_and_print();
return 0;
}