#include<cstdio>
using namespace std;
#define dim 100001
int N, M;
int arb[4*dim];
int start, stop, val, poz, maxx;
void Update(int, int, int);
void Query(int, int, int);
inline int MAXIM(int a, int b)
{
if ( a > b)
return a;
return b;
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d", &N, &M);
int x, a, b;
for ( int i = 1; i <= N; i++)
{
scanf("%d", &x);
poz = i;
val = x;
Update( 1, 1, N);
}
for ( int i = 1; i <= M; i++)
{
scanf("%d%d%d", &x, &a, &b);
if ( x == 0 )
{
maxx = -189;
start = a, stop = b;
Query( 1, 1, N);
printf("%d\n", maxx);
}
else
{
poz = a; val = b;
Update( 1, 1, N);
}
}
}
void Update(int nod, int st, int dr)
{
if ( st == dr )
{
arb[nod] = val;
return;
}
int div = (st + dr)/2;
if (poz <= div) Update(2*nod, st, div);
else Update(2*nod + 1, div + 1, dr);
arb[nod] = MAXIM( arb[2*nod], arb[2*nod + 1] );
}
void Query(int nod, int st, int dr)
{
if ( start <= st && dr <= stop )
{
if ( maxx < arb[nod] ) maxx = arb[nod];
return;
}
int div = (st + dr)/2;
if ( start <= div ) Query(2*nod,st,div);
if ( div < stop ) Query(2*nod+1,div+1,dr);
}