#include <cstdio>
using namespace std;
#define NMAX 262145
#define inf 214700000
//#define max(a, b) (a) > (b) ? (a) : (b)
long n, m, code, a, b, indexes[NMAX], x[NMAX], aint[NMAX];
inline long max(long a, long b)
{
return a > b ? a : b;
}
void build(long left, long right, long index)
{
if (left == right)
{
indexes[left] = index;
}
long middle = (left + right) / 2;
build(left, middle, 2 * index);
build(middle + 1, right, 2 * index + 1);
}
inline void update(long index, long value)
{
aint[index] = value;
index /= 2;
while (index)
{
aint[index] = max(aint[2 * index], aint[2 * index + 1]);
index /= 2;
}
}
long query(long a, long b, long left, long right, long index)
{
if (a <= left && right <= b)
return aint[index];
long middle = (left + right) / 2, rez = -inf;
if (a <= middle)
rez = max(rez, query(a, b, left, middle, 2 * index));
if (b > middle)
rez = max(rez, query(a, b, middle + 1, right, 2 * index + 1));
return rez;
}
int main()
{
freopen ("arbint.in", "rt", stdin);
freopen ("arbint.out", "wt", stdout);
scanf("%ld %ld", &n, &m);
build(1, n, 1);
for (long i = 1; i <= n; ++i)
scanf("%ld", &x[i]), update(indexes[i], x[i]);
for (long i = 1; i <= m; ++i)
{
scanf("%ld %ld %ld", &code, &a, &b);
if (!code)
printf("%ld\n", query(a, b, 1, n, 1));
else
update(indexes[a], b);
}
return 0;
}