#include<stdio.h>
using namespace std;
const int N = 200005, INF = 1000000000;
int v[N], poz, val;
int maxim (int a, int b)
{
return a < b ? b : a;
}
void update (int p, int st, int dr)
{
if (st == dr)
{
v[p] = val;
return;
}
int m = (st + dr) / 2;
if (poz <= m)
update (p * 2, st, m);
else
update (p * 2 + 1, m + 1, dr);
v[p] = maxim (v[p * 2], v[p * 2 + 1]);
}
int a, b;
int query (int p, int st, int dr)
{
if (a <= st && dr <= b)
return v[p];
int m = (st + dr) / 2, m1 = -INF, m2 = -INF;
if (a <= m)
m1 = query (2 * p, st, m);
if (b > m)
m2 = query (2 * p + 1, m + 1, dr);
return maxim (m1, m2);
}
int main ()
{
FILE *in, *out;
in = fopen ("arbint.in", "r");
out = fopen ("arbint.out", "w");
int n, m;
fscanf (in, "%d%d", &n, &m);
int i;
for (i = 1; i <= n; i++)
{
fscanf (in, "%d", &val);
poz = i;
update (1, 1, n);
}
int task;
for (i = 1; i <= m; i++)
{
fscanf (in, "%d", &task);
if (task == 0)
{
fscanf (in, "%d%d", &a, &b);
fprintf (out, "%d\n", query (1, 1, n));
}
else
{
fscanf (in, "%d%d", &poz, &val);
update (1, 1, n);
}
}
return 0;
}