#include <stdio.h>
const int DIM = 100005 * 18, OO = (1<<30)-1;
int AI[DIM], N, M, Max, A, B;
int maxim (int a, int b)
{
return a < b ? b : a;
}
void update (int n, int s, int d)
{
if (s == d)
{
AI[n] = B;
return;
}
int m = (s + d) >> 1, f = n << 1;
if (A <= m)
update (f , s , m);
else
update (f+1, m+1, d);
AI[n] = maxim (AI[f], AI[f+1]);
}
void query (int n, int s, int d)
{
if (A <= s && d <= B)
{
Max = maxim (Max, AI[n]);
return;
}
int m = (s + d) >> 1, f = n << 1;
if (A <= m)
query (f , s , m);
if (m+1 <= B)
query (f+1, m+1, d);
}
int main ()
{
freopen ("arbint.in", "r", stdin);
freopen ("arbint.out", "w", stdout);
scanf ("%d%d", &N, &M);
for (A = 1; A <= N; A++)
{
scanf ("%d", &B);
update (1, 1, N);
}
for (int i = 0, t; i < M; i++)
{
scanf ("%d%d%d", &t, &A, &B);
if (t == 1)
{
update (1, 1, N);
}
else
{
Max = -OO;
query (1, 1, N);
printf ("%d\n", Max);
}
}
return 0;
}