#include <cstdio>
#include <iostream>
using namespace std;
#define NMAX 100005
int Aint[ NMAX * 5 ];
void Update ( int st, int dr, int poz, int val, int nod );
int Querry ( int st, int dr, int poz, int start, int finish );
int main () {
freopen( "arbint.in", "r", stdin );
freopen( "arbint.out", "w", stdout );
int n, m, i, j, x, y, c;
scanf( "%d%d",&n,&m );
for ( i = 1; i <= n; ++i ) {
scanf( "%d",&x );
Update( 1, n, 1, x, i );
}
while ( m-- ) {
scanf( "%d%d%d",&c,&x,&y );
if ( c == 1 ) {
Update( 1, n, 1, y, x );
} else {
printf( "%d\n",Querry( 1, n, 1, x, y ) );
}
}
return 0;
}
void Update ( int st, int dr, int poz, int val, int nod ) {
if ( st == dr ) {
Aint[ poz ] = val;
return ;
}
int mid = ( st + dr ) / 2;
if ( nod <= mid ) Update( st, mid, poz * 2, val, nod );
else Update( mid + 1, dr, poz * 2 + 1, val, nod );
Aint[ poz ] = max ( Aint[ poz * 2 ], Aint[ poz * 2 + 1 ] );
}
int Querry ( int st, int dr, int poz, int start, int finish ) {
if ( start <= st && dr <= finish ) {
return Aint[ poz ];
}
int mid = ( st + dr ) / 2;
int a, b; a = b = -1;
if ( start <= mid ) a = Querry( st, mid, poz * 2, start, finish );
if ( mid < finish ) b = Querry( mid + 1, dr, poz * 2 + 1, start, finish );
return max ( a, b );
}