#include<fstream>
#define max 100005
using namespace std;
int v[max],MAX;
int A[4*max];
int n,m;
inline int maxim( int a, int b){ return a>b?a:b; }
void UPDATE( int nod, int i, int j,int poz, int val){
int mij;
if ( i>=j) {A[nod] = val;return;}
mij = ( i+j )/2;
if( poz <= mij ) UPDATE( nod*2 , i, mij, poz, val);
else UPDATE( nod*2 + 1 , mij+1, j, poz, val);
A[ nod ] = maxim ( A[ nod*2] , A[ nod*2 + 1] );
}
void QUERY( int nod, int st, int dr, int i, int j){
if( i<=st && dr<=j ) { MAX = maxim( MAX, A[nod] );return; }
int mij = ( st + dr ) / 2;
if( i <= mij ) QUERY( nod*2 , st, mij, i, j);
if( j > mij ) QUERY( nod*2 + 1 , mij+1, j, i, j);
}
int main(){
ifstream f("arbint.in");
ofstream g("arbint.out");
f>>n>>m;
int i,o,a,b;
for( i=1; i<=n; i++) { f>>v[i]; UPDATE(1,1,n,i,v[i]); }
for( ; m-- ; ){
f>>o>>a>>b;
if( o ) UPDATE( 1, 1, n, a, b);
else{
MAX = -1;
QUERY( 1, 1,n,a,b);
g<<MAX<<'\n';
}
}
return 0;
}