/*
* File: main.cpp
* Author: virtualdemon
*
* Created on April 25, 2010, 7:15 PM
*/
#include <cstdlib>
#include <fstream>
#define Nmax 400011
/*
*
*/
using namespace std;
int Aint[Nmax];
inline void UpDate( int vertex, int left, int right, int P, int x )
{
if( left == right )
{
Aint[vertex]=x;
return;
}
int middle=left+(right-left)/2;
if( P <= middle )
UpDate( 2*vertex, left, middle, P, x );
else UpDate( 2*vertex+1, middle+1, right, P, x );
Aint[vertex]=max( Aint[2*vertex], Aint[2*vertex+1] );
}
inline int Query( int vertex, int left, int right, int a, int b )
{
if( a <= left && right <= b )
return Aint[vertex];
int middle=left+(right-left)/2, x=-1;
if( a <= middle )
x=Query( 2*vertex, left, middle, a, b );
if( b > middle )
x=max( x, Query( 2*vertex+1, middle+1, right, a, b ) );
return x;
}
int main(int argc, char** argv)
{
int N, M, x, i;
ifstream in( "arbint.in" );
ofstream out( "arbint.out" );
for( in>>N>>M, i=1; i <= N; ++i )
{
in>>x;
UpDate( 1, 1, N, i, x );
}
for( ; M; --M )
{
in>>i;
if( !i )
{
in>>i>>x;
out<<Query( 1, 1, N, i, x )<<'\n';
continue;
}
in>>i>>x;
UpDate( 1, 1, N, i, x );
}
return (EXIT_SUCCESS);
}