/*
~Keep It Simple!~
*/
#include <stdio.h>
int n,m,max;
int ar[200001];
void Add(int node,int a,int b,int poz,int val)
{
if(a<=poz && poz<=b)
if(ar[node] < val)
ar[node] = val;
if( a == b )
return;
int mid = (a + b)/2;
if( a<=poz && poz <= mid)
Add(2*node,a,mid,poz,val);
else if( mid<=poz && poz <= b)
Add(2*node+1,mid+1,b,poz,val);
}
void ask(int node,int left, int right, int a, int b)
{
if( a<=left && b >= right)
{
if(max < ar[node]) max = ar[node];
return;
}
int mid = (left+right)/2;
if( a <= mid )
ask(2*node,left,mid,a,b);
if ( b > mid )
ask(2*node+1,mid+1 ,right,a,b);
}
void update(int node,int left,int right,int poz,int val)
{
if( left == right )
{
ar[node] = val;
return;
}
else
{
int mid = (left+right)/2;
if( left<= poz && poz <= mid) update(2*node,left,mid,poz,val);
else if ( mid<=poz && poz<=right) update(2*node+1,mid+1,right,poz,val);
ar[node] = ar[2*node] > ar[2*node+1] ? ar[2*node]:ar[2*node+1];
}
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&n,&m);
int x,y,z;
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
Add(1,1,n,i,x);
}
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&z,&x,&y);
if( z == 0 )
{
max = 0;
ask(1,1,n,x,y);
printf("%d\n",max);
}
else if ( z == 1)
{
update(1,1,n,x,y);
}
}
}