#include<stdio.h>
#include<algorithm>
#define NMAX 1000001
using namespace std;
int Arbi[NMAX];
int a , n , m , b , Tip , Ans , poz;
void update(int nod , int st , int dr , int poz , int val)
{
if(st == dr)
{
Arbi[nod] = val;
return ;
}
int med = (st + dr) >> 1;
if(med >= poz)
update(2 * nod , st , med , poz , val);
else
update(2 * nod + 1 , med + 1 , dr , poz , val);
Arbi[nod] = max(Arbi[nod * 2] , Arbi[nod * 2 + 1]);
}
void query(int nod , int st , int dr , int x , int y)
{
if(st >= x && dr <= y)
{
Ans = max(Ans , Arbi[nod]);
return ;
}
int med = (st + dr) >> 1;
if(med >= x)
query(2 * nod , st , med , x , y);
if(med < y)
query(2 * nod + 1 , med + 1 , dr , x , y);
}
int main()
{
freopen("arbint.in" , "r" , stdin);
freopen("arbint.out" , "w" , stdout);
scanf("%d %d" , &n , &m);
for(int i = 1 ; i <= n ; ++ i)
scanf("%d" , &a) , update(1 , 1 , n , i , a);
for(int i = 1 ; i <= m ; ++ i)
{
scanf("%d %d %d" , &Tip , &a , &b);
if(Tip == 0)
{
Ans = 0;
query(1 , 1 , n , a , b);
printf("%d\n" , Ans);
}
else
update(1 , 1 , n , a , b);
}
return 0;
}