#include <stdio.h>
#include <algorithm>
using namespace std;
int arb[300000];
int v[100005];
void construct(int st, int dr, int nod)
{
if(st==dr)
{
arb[nod]=v[st];
return;
}
int mid=(st+dr)/2;
construct(st,mid,nod*2);
construct(mid+1,dr,nod*2+1);
arb[nod]=max(arb[nod*2], arb[nod*2+1]);
}
void update(int st, int dr, int nod, int poz, int val)
{
if(st==dr)
{
arb[nod]=val;
return;
}
int mid=(st+dr)/2;
if(poz<=mid)
{
update(st,mid,nod*2,poz,val);
}
else
{
update(mid+1,dr,nod*2+1,poz,val);
}
arb[nod]=max(arb[nod*2], arb[nod*2+1]);
}
int maxInterval(int st, int dr,int sourceSt, int sourceDr, int nod)
{
if(sourceSt<=st && dr<=sourceDr)
{
return arb[nod];
}
int maxValue = 0;
int mid=(st+dr)/2;
if(sourceSt<=mid)
{
maxValue = maxInterval(st, mid,sourceSt, sourceDr, nod*2);
}
if(mid<sourceDr)
{
maxValue = max(maxValue,maxInterval(mid+1, dr,sourceSt, sourceDr, nod*2+1));
}
return maxValue;
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
int n,m;
scanf("%d %d",&n,&m);
for(int i=1; i<=n; i++)
{
scanf("%d",&v[i]);
}
construct(1,n,1);
for(int i=0; i<m; i++)
{
int o,a,b;
scanf("%d %d %d",&o,&a, &b);
if(o==0)
{
printf("%d\n",maxInterval(1,n,a,b,1));
continue;
}
if(o==1)
{
update(1,n,1,a,b);
continue;
}
}
}