#include <stdio.h>
#define RMAX 500000
int n, m, r[RMAX], max;
inline int MAX(int a, int b)
{
return a > b ? a: b;
}
void update(int n, int st, int dr, int poz, int val)
{
int m;
if ( st == dr)
r[n] = val;
else
{
m = ( st + dr ) / 2;
if ( poz <= m)
update( 2 * n, st, m, poz, val);
else
update( 2 * n + 1, m + 1, dr, poz, val);
r[n] = MAX( r[2 * n], r[2 * n +1] );
}
}
void query(int n, int st, int dr, int a, int b)
{
int m;
if ( a <= st && dr <= b)
max = MAX(max, r[n]);
else
{
m = ( st + dr) / 2;
if ( a <= m)
query( 2 * n, st, m, a, b);
if ( b > m)
query( 2 * n + 1, m + 1, dr, a, b);
}
}
int main()
{
int i, a, b, p, x;
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d", &n, &m);
for ( i = 1; i <= n; i++)
{
scanf("%d", &x);
update(1, 1, n, i, x);
}
for ( i = 1; i <= m; i++)
{
scanf("%d %d %d", &p, &a, &b);
if ( p == 0)
{
max = 0;
query(1, 1, n, a, b);
printf("%d\n", max);
}
else
update(1, 1, n, a, b);
}
return 0;
}