#include <cstdio>
#include <cstring>
using namespace std;
#define FIN "arbint.in"
#define FOUT "arbint.out"
#define MAX_N 100005
int A[MAX_N << 1];
int C[MAX_N];
char S[MAX_N * 10];
int N, M, x, y;
inline int MAX (int a, int b)
{
if (a > b) return a; else return b;
}
void buildarb (int nod, int li, int lf)
{
if (li == lf) A[nod] = C[li];
else
{
int m = (li + lf) >> 1;
buildarb (nod << 1, li, m);
buildarb ((nod << 1)|1, m + 1, lf);
A[nod] = MAX (A[nod << 1], A[(nod << 1)|1]);
}
}
int query (int nod, int li, int lf)
{
if (x <= li && lf <= y) return A[nod];
if (y < li || lf < x) return -1;
int m = (li + lf) >> 1;
return MAX (query (nod << 1, li, m), query ((nod << 1)|1, m + 1, lf));
}
void update (int nod, int li, int lf)
{
if (li == lf)
{
A[nod] = y;
return;
}
int m = (li + lf) >> 1;
if (x <= m) update (nod << 1, li, m);
else update ((nod << 1)|1, m + 1, lf);
A[nod] = MAX (A[nod << 1], A[(nod << 1)|1]);
}
int main ()
{
int i, e = 0, L, k = 0;
freopen (FIN, "r", stdin);
freopen (FOUT, "w", stdout);
scanf ("%d %d\n", &N, &M);
gets (S);
L = strlen (S);
for (i = 0; i < L; ++i)
if (S[i] == ' ') C[++k] = e, e = 0;
else e = e * 10 + (S[i] - '0');
S[++k] = e;
buildarb (1, 1, N);
while (M--)
{
int tp;
scanf ("%d %d %d", &tp, &x, &y);
if (!tp)
printf ("%d\n", query (1, 1, N));
else update (1, 1, N);
}
return 0;
}