#include <stdio.h>
#define maxim(a, b) ((a > b) ? a : b)
#define NMax 100005
#define AMax 262144
int N, M, A[AMax];
void update(int n, int l, int r, int poz, int val)
{
if (l == r)
{
A[n] = val;
return ;
}
int m = (l + r) / 2;
if (poz <= m)
update(2*n, l, m, poz, val);
else
update(2*n+1, m+1, r, poz, val);
A[n] = maxim(A[2*n], A[2*n+1]);
}
int query(int n, int l, int r, int a, int b)
{
if (a <= l && r <= b)
return A[n];
int m = (l + r) / 2, i1 = 0, i2 = 0;
if (a <= m) i1 = query(2*n, l, m, a, b);
if (b > m) i2 = query(2*n+1, m+1, r, a, b);
return maxim(i1, i2);
}
int main(void)
{
int i, tip, a, b;
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d", &N, &M);
for (i = 1; i <= N; i++)
{
scanf("%d", &a);
update(1, 1, N, i, a);
}
for (; M; --M)
{
scanf("%d %d %d", &tip, &a, &b);
if (!tip)
{
printf("%d\n", query(1, 1, N, a, b));
continue;
}
update(1, 1, N, a, b);
}
return 0;
}