#include <stdio.h>
#define NMAX 100001
#define lf (nod<<1)
#define rt (lf+1)
int n, m;
int s[NMAX], max[2*NMAX];
int i, j, k, o;
int vmax;
void Update(int nod, int st, int dr, int pos);
void Query(int nod, int st, int dr, int a, int b);
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d", &n, &m);
for ( i = 1; i <= n; i++ )
scanf("%d", &s[i]),
Update(1, 1, n, i);
for ( k = 1; k <= m; k++ )
{
scanf("%d %d %d", &o, &i, &j);
if ( o == 0 )
{
vmax = 0;
Query(1, 1, n, i, j);
printf("%d\n", vmax);
}
else
{
s[i] = j;
Update(1, 1, n, i);
}
}
return 0;
}
void Update(int nod, int st, int dr, int pos)
{
if ( st == dr )
{
max[nod] = s[pos];
return;
}
int mij = (st+dr)>>1;
if ( pos <= mij ) Update(lf, st, mij, pos);
if ( mij < pos ) Update(rt, mij+1, dr, pos);
max[nod] = max[lf] > max[rt] ? max[lf] : max[rt];
}
void Query(int nod, int st, int dr, int a, int b)
{
if ( a <= st && dr <= b )
{
vmax = vmax < max[nod] ? max[nod] : vmax;
return;
}
int mij = (st+dr)>>1;
if ( a <= mij ) Query(lf, st, mij, a, b);
if ( mij < b ) Query(rt, mij+1, dr, a, b);
}