#include<stdio.h>
#define MAX 400001
int A[MAX] ;
void update(int n , int l , int r , int poz , int val );
int query(int n , int l , int r , int a , int b );
int max(int a , int b);
int main()
{
int n , m , x , i , t , a , b;
freopen("arbint.in" , "r" , stdin );
freopen("arbint.out" , "w" , stdout );
scanf("%d%d" , &n , &m );
for(i = 1 ; i <= n ; ++i )
{
scanf("%d" , &x);
update(1,1,n,i,x);
}
for(i = 1 ; i <= m ; ++i )
{
scanf("%d%d%d", &t , &a , &b);
if(t == 0)printf("%d\n" , query(1,1,n,a,b));
else update(1,1,n,a,b);
}
return 0;
}
int max(int a , int b)
{
if(a > b)return a;
return b;
}
void update(int n , int l , int r , int poz , int val )
{
int mijl = (l+r)/2;
if(l == r)A[n] = val;
else
{
if(poz <= mijl)update(2*n,l,mijl,poz,val);
else update(2*n+1,mijl+1,r,poz,val);
A[n] = max(A[2*n],A[2*n+1]);
}
}
int query(int n , int l , int r , int a , int b)
{
int mijl = (l+r)/2 , best = 0;
if(a <= l && b >= r)return A[n];
else
{
if(a <= mijl)best = query(2*n,l,mijl,a,b);
if(b > mijl)best = max(best , query(2*n+1,mijl+1,r,a,b));
return best;
}
}