#include <cstdio>
#include <cstring>
using namespace std;
#define FIN "arbint.in"
#define FOUT "arbint.out"
#define MAX_N 100000
int Arb[MAX_N << 2];
int V[MAX_N];
int N, M, enew, pos, A, B;
void buildarb (int nod, int l, int r)
{
if (l == r) Arb[nod] = V[l];
else
{
int m = (l + r) >> 1;
buildarb (nod << 1, l, m);
buildarb ((nod << 1)|1, m + 1, r);
if (Arb[nod << 1] > Arb[(nod << 1)|1]) Arb[nod] = Arb[nod << 1];
else Arb[nod] = Arb[(nod << 1)|1];
}
}
void update (int nod, int l, int r)
{
if (l == r) {
Arb[nod] = enew;
return;
}
int m = (l + r) >> 1;
if (pos <= m) update (nod << 1, l, m);
else update ((nod << 1)|1, m + 1, r);
if (Arb[nod << 1] > Arb[(nod << 1)|1]) Arb[nod] = Arb[nod << 1];
else Arb[nod] = Arb[(nod << 1)|1];
}
int query (int nod, int l, int r)
{
if (A <= l && r <= B) return Arb[nod];
if (r < A || B < l) return -1;
int m = (l + r) >> 1;
int ml = query (nod << 1, l, m);
int mr = query ((nod << 1)|1, m + 1, r);
if (ml > mr) return ml; else return mr;
}
int main ()
{
freopen (FIN, "r", stdin);
freopen (FOUT, "w", stdout);
scanf ("%d %d", &N, &M);
int i;
for (i = 1; i <= N; ++i) scanf ("%d", V + i);
buildarb (1, 1, N);
for (i = 1; i <= M; ++i)
{
int t;
scanf ("%d", &t);
if (!t) {
scanf ("%d %d", &A, &B);
int ret = query (1, 1, N);
printf ("%d\n", ret);
}
else
{
scanf ("%d %d", &pos, &enew);
update (1, 1, N);
}
}
return 0;
}