#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int n,m,i,j;
int a[100001];
int aint[1000001];
void generate(int curent_node,int st,int dr)
{
int maximum_value=0,i,med;
if(st==dr){ aint[curent_node]=a[st]; return ;}
for(i=st;i<=dr;i++)
{
if(maximum_value<a[i])
maximum_value=a[i];
}
aint[curent_node]=maximum_value;
med=(st+dr)/2;
generate(2*curent_node,st,med);
generate(2*curent_node+1,med+1,dr);
}
void update(int curent_node,int st,int dr,int poz,int val)
{
int med;
if(st==dr)
{
aint[curent_node]=val;
return ;
}
med=(st+dr)/2;
if(poz<=med) update(2*curent_node,st,med,poz,val);
else update(2*curent_node+1,med+1,dr,poz,val);
aint[curent_node]=max(aint[2*curent_node],aint[2*curent_node+1]);
}
int ans;
void query(int curent_node,int st,int dr,int x,int y)
{
int med;
if(x<=st&&y>=dr)
{
ans=max(ans,aint[curent_node]);
return ;
}
med=(st+dr)/2;
if(x<=med) query(2*curent_node,st,med,x,y);
if(y>med) query(2*curent_node+1,med+1,dr,x,y);
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
int i;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
generate(1,1,n);
int tip,x,y;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&tip,&x,&y);
if(tip==1) update(1,1,n,x,y);
if(tip==0){ query(1,1,n,x,y); printf("%d\n",ans); ans=0;}
}
return 0;
}