#include <cstdio>
using namespace std;
#define Input "arbint.in"
#define Output "arbint.out"
#define NMAX 1<<16+5
int arb[NMAX],pos,val,middle,maxim,start,final;
inline int max(int a,int b)
{
if(a>b)
return a;
return b;
}
void update(int node,int left,int right)
{
if(left==right)
{
arb[node]=val;
return;
}
middle=(left+right)/2;
if(pos<=middle)
update(2*node,left,middle);
if(pos>middle)
update(2*node+1,middle+1,right);
arb[node]=max(arb[2*node],arb[2*node+1]);
}
void query(int node,int left,int right)
{
if(start<=left && right<=final)
{
if(maxim<arb[node])
maxim=arb[node];
return;
}
middle=(right+left)/2;
if(start<=middle)
query(2*node,left,middle);
if(middle<final)
query(2*node+1,middle+1,right);
}
int main()
{
int n,m,i,type,v1,v2;
freopen (Input,"r",stdin);
freopen (Output,"w",stdout);
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&val);
pos=i;
update(1,1,n);
}
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&type,&v1,&v2);
if(!type)
{
start=v1;
final=v2;
maxim=0;
query(1,1,n);
printf("%d\n",maxim);
}
else
{
pos=v1;
val=v2;
update(1,1,n);
}
}
}