#include <cstdio>
#include <algorithm>
using namespace std;
FILE *fi,*fo;
int n,m,i,tip,a,b;
int A[100001],T[100001];
void build(int ind,int st,int dr)
{
if(dr-st<2)
{
T[ind]=A[st];
return ;
}
int mid=(st+dr)/2;
build(2*ind,st,mid);
build(2*ind+1,mid,dr);
T[ind]=max(T[2*ind],T[2*ind+1]);
}
int query(int l,int r,int ind, int st,int dr)
{
if(st>=r || dr<=l)
return 0;
if(l<=st && dr<=r)
return T[ind];
int mid=(st+dr)/2;
return max(query(l,r,2*ind,st,mid),query(l,r,2*ind+1,mid,dr));
}
void update(int poz,int val,int ind,int st,int dr)
{
if(st>poz||poz>=dr)
return;
if(dr-st<2)
{
if(st==poz)
{
T[ind]=val;
}
return ;
}
int mid=(st+dr)/2;
update(poz,val,2*ind,st,mid);
update(poz,val,2*ind+1,mid,dr);
T[ind]=max(T[2*ind],T[2*ind+1]);
}
int main()
{
fi=fopen("arbint.in","r");
fo=fopen("arbint.out","w");
fscanf(fi,"%d%d",&n,&m);
for(i=0;i<n;i++)
fscanf(fi,"%d",&A[i]);
build(1,0,n);
for(i=1;i<=m;i++)
{
fscanf(fi,"%d%d%d",&tip,&a,&b);
if(tip == 0)
fprintf(fo,"%d\n",query(a-1,b,1,0,n));
else
update(a-1,b,1,0,n);
}
fclose(fi);
fclose(fo);
return 0;
}