#include<stdio.h>
#define inf "arbint.in"
#define outf "arbint.out"
#define NMax 100000
using namespace std;
int MaxArb[5*NMax];
int N, M;
int start, end, value, pos, maxim;
inline int Max(int a, int b) { return ( a>b ? a : b ); }
void Update(int, int, int);
void Query(int, int, int);
int main()
{
freopen(inf,"r",stdin); freopen(outf,"w",stdout);
scanf("%d%d", &N, &M);
for(int i=1; i<=N; i++)
{
scanf("%d", &value);
pos = i;
Update(1,1,N);
}
//printf("%d", MaxArb[1]);
int op, A, B;
for(int i=1; i<=M; i++)
{
scanf("%d%d%d", &op, &A, &B);
if( !op )
{
maxim = -1;
start = A; end = B;
Query(1,1,N);
printf("%d\n", maxim);
}
else
{
pos = A; value = B;
Update(1,1,N);
}
}
return 0;
}
void Update(int nod, int left, int right)
{
if( left==right )
{
MaxArb[nod] = value;
return;
}
int m = (left+right)/2;
if( pos<=m ) Update(2*nod, left, m);
else Update(2*nod+1, m+1, right);
MaxArb[nod] = Max( MaxArb[2*nod], MaxArb[2*nod+1] );
}
void Query(int nod, int left, int right)
{
if( right<=end && left>=start )
{
maxim = Max( maxim, MaxArb[nod] );
return;
}
int m = (left+right)/2;
if( start<=m ) Query(2*nod, left, m);
if( end > m ) Query(2*nod+1, m+1, right);
}