#include<stdio.h>
#include<algorithm>
#define nrn 200000
#define lson(x) (x*2)
#define rson(x) (x*2+1)
using namespace std;
FILE *in=fopen("arbint.in","r"),*out=fopen("arbint.out","w");
int TREE[nrn],n;
void update(int left,int right,int a,int b,int nod,int val)
{
int mijl;
if(a<=left&&b>=right)
{
TREE[nod]=val;
return ;
}
mijl=(left+right)/2;
if(a<=mijl)
update(left,mijl,a,b,nod*2,val);
if(b>mijl)
update(mijl+1,right,a,b,nod*2+1,val);
TREE[nod]=max(TREE[lson(nod)],TREE[rson(nod)]);
}
int query(int left,int right,int a,int b,int nod)
{
int mijl;
if(a<=left && b>=right)
return TREE[nod];
mijl=(left+right)/2;
if(a<=mijl && b>mijl)
return max(query(left,mijl,a,b,nod*2),query(mijl+1,right,a,b,nod*2+1));
if(a<=mijl)
return query(left,mijl,a,b,nod*2);
if(b>mijl)
return query(mijl+1,right,a,b,nod*2+1);
}
int main()
{
int i,a,b,m,v;
fscanf(in,"%d %d",&n,&m);
for(i=1;i<=n;++i)
{
fscanf(in,"%d",&v);
update(1,n,i,i,1,v);
}
for(i=1;i<=m;++i)
{
fscanf(in,"%d %d %d",&v,&a,&b);
switch(v)
{
case(0):fprintf(out,"%d\n",query(1,n,a,b,1));break;
case(1):update(1,n,a,a,1,b);break;
}
}
return 0;
}