#include <fstream>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int n,q,A[100005],aint[400005];
void build(int node,int st,int dr)
{
if(st==dr)
{
aint[node]=A[st];
return;
}
int mij=(st+dr)>>1;
build(2*node,st,mij);
build(2*node+1,mij+1,dr);
aint[node]=max(aint[2*node],aint[2*node+1]);
}
void update(int val,int pos,int node,int st,int dr)
{
if(st==dr)
{
aint[node]=val;
return;
}
int mij=(st+dr)>>1;
if(pos<=mij)
update(val,pos,2*node,st,mij);
else
update(val,pos,2*node+1,mij+1,dr);
aint[node]=max(aint[2*node],aint[2*node+1]);
}
int query(int x,int y,int node,int st,int dr)
{
if(x>dr || y<st)
return -1;
if(st>=x && dr<=y)
return aint[node];
int mij=(st+dr)>>1;
int left=query(x,y,2*node,st,mij);
int right=query(x,y,2*node+1,mij+1,dr);
return max(left,right);
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin>>n>>q;
for(int i=1;i<=n;i++)
cin>>A[i];
build(1,1,n);
while(q--)
{
int op,x,y;
cin>>op>>x>>y;
if(op==1)
update(y,x,1,1,n);
else
cout<<query(x,y,1,1,n)<<"\n";
}
return 0;
}