#include <bits/stdc++.h>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int T[200005], v[100005];
void actualizare(int nod, int st, int dr, int n, int val)
{
if (dr < st) return;
if (st == n && dr == n) T[nod] = val;
else {
int mij = (st + dr) / 2;
if (n > mij) actualizare(2 * nod + 1, mij + 1, dr, n, val);
if (n <= mij) actualizare(2 * nod, st, mij, n, val);
T[nod] = max(T[2 * nod], T[2 * nod + 1]);
}
}
int interogare (int nod, int st, int dr, int a, int b, int n)
{
if (nod > 2 * n - 1 || st > dr) return 0;
if (a <= st && b >= dr) return T[nod];
else {
int mij = (st + dr) / 2;
int a1 = 0, a2 = 0;
if (a <= mij) a1 = interogare(2 * nod, st, mij, a, b, n);
if (b > mij) a2 = interogare(2 * nod + 1, mij + 1, dr, a, b, n);
return max(a1, a2);
}
}
int main()
{
int n, m;
fin >> n >> m;
int nod = 1;
for (int i = 1; i <= n; i ++) {
fin >> v[i];
actualizare(nod, 1, n, i, v[i]);
}
int t, a, b;
for (int i = 1; i <= m; i ++) {
fin >> t >> a >> b;
if (t == 0) fout << interogare(1, 1, n, a, b, n) << "\n";
else actualizare(1, 1, n, a, b);
}
return 0;
}