/*
* File: main.cpp
* Author: bitone
*
* Created on October 13, 2010, 3:23 PM
*/
#include <fstream>
#include <cstdlib>
#define MAX_N 400011
#define oo 2000000000
using namespace std;
/*
*
*/
int A[MAX_N];
inline void Update( int vertex, int left, int right, int& index, int& value )
{
if( left == right )
{
A[vertex]=value;
return;
}
int middle=left+(right-left)/2;
if( index <= middle )
Update( 2*vertex, left, middle, index, value );
else Update( 2*vertex+1, middle+1, right, index, value );
A[vertex]=max( A[2*vertex], A[2*vertex+1] );
}
inline int Query( int vertex, int left, int right, int& a, int& b )
{
if( a <= left && b >= right )
return A[vertex];
int q1=0, q2=0, middle=left+(right-left)/2;
if( a <= middle )
q1=Query( 2*vertex, left, middle, a, b );
if( b > middle )
q2=Query( 2*vertex+1, middle+1, right, a, b );
return max( q1, q2 );
}
int main(int argc, char** argv)
{
int N, M, x, i;
ifstream in( "arbint.in" );
in>>N>>M;
for( i=1; i <= N; ++i )
{
in>>x;
Update( 1, 1, N, i, x );
}
ofstream out( "arbint.out" );
for(; M; --M )
{
in>>i;
if( 0 == i )
{
in>>i>>x;
out<<Query( 1, 1, N, i, x )<<'\n';
}
else {
in>>i>>x;
Update( 1, 1, N, i, x );
}
}
return EXIT_SUCCESS;
}