//problema arbint
#include <iostream>
#include <fstream>
using namespace std;
#define DIM 500002
long long int segment_tree[DIM],arr[DIM],n,q,a,b,maxim=-1;
void update(int node,int left,int right,int position,int num)
{
if(left==right)
{
segment_tree[node]=num;
}
else
{
int middle=(left+right)/2;
if(position<=middle)
{
update(2*node,left,middle,position,num);
}
else
{
update(2*node+1,middle+1,right,position,num);
}
segment_tree[node]=max(segment_tree[2*node],segment_tree[2*node+1]);
}
}
void query(int node,int left,int right,int q_left,int q_right)
{
if(q_left<=left && right<=q_right)
{
maxim=max(maxim,segment_tree[node]);
}
else
{
int middle=(right+left)/2;
if(q_left<=middle)
{
query(2*node,left,middle,q_left,q_right);
}
else
{
query(2*node+1,middle+1,right,q_left,q_right);
}
}
}
void citire()
{
ifstream fin("arbint.in");
fin>>n>>q;
for(int i=1;i<=n;i++)
{
fin>>arr[i];
update(1,1,n,i,arr[i]);
}
int comm;
ofstream fout("arbint.out");
while(q--)
{
fin>>comm>>a>>b;
if(comm)
{
update(1,1,n,a,b);
}
else
{
maxim=-1;
query(1,1,n,a,b);
fout<<maxim<<'\n';
}
}
}
int main()
{
citire();
}