#include <cstdio>
#include <algorithm>
using namespace std;
int v[100002],arb[300002],mx;
void recalculate(int node)
{
arb[node]=max(arb[node*2],arb[node*2+1]);
}
void build(int node,int a,int b)
{
if(a==b)
arb[node]=v[a];
else
{
build(2*node,a,(a+b)/2);
build(2*node+1,(a+b)/2+1,b);
recalculate(node);
}
}
void query(int a,int b,int node,int st,int dr)
{
if(a<=st&&dr<=b)
{
if(arb[node]>mx)
mx=arb[node];
}
else
{
int mid=(st+dr)/2;
if(mid>=a)
query(a,b,node*2,st,mid);
if(mid+1<=b)
query(a,b,node*2+1,mid+1,dr);
}
}
void update(int poz,int k,int node,int st,int dr)
{
int mid=(st+dr)/2;
if(st!=dr)
{
if(poz<=mid)
update(poz,k,2*node,st,mid);
else update(poz,k,2*node+1,mid+1,dr);
recalculate(node);
}
else arb[node]=k;
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
int n,i,m,p,a,b,j;
scanf("%d%d",&n,&m);
for(i=1; i<=n; i++)
scanf("%d",&v[i]);
build(1,1,n);
for(i=1; i<=m; i++)
{
scanf("%d%d%d",&p,&a,&b);
if(!p)
{
mx=-1;
query(a,b,1,1,n);
printf("%d\n",mx);
}
else update(a,b,1,1,n);
}
return 0;
}