#include <fstream>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
const int N = 1e5 + 5;
#define mid ((lo + hi) >> 1)
#define nod1 (node << 1)
#define nod2 ((nod1) + 1)
int arb[N*3], n, m, v[N];
void update (int node, int lo, int hi, int poz, int x) {
if (lo == hi) {
arb[node] = x;
return;
}
if (poz <= mid)
update (nod1, lo, mid, poz, x);
else
update (nod2, mid + 1, hi, poz, x);
arb[node] = max(arb[nod1], arb[nod2]);
}
int query (int node, int lo, int hi, int left, int right) {
if (lo > right || hi < left)
return -2e9;
if (left <= lo && hi <= right)
return arb[node];
int MAX = -2e9;
if (left <= mid)
MAX = max(MAX, query (nod1, lo, mid, left, right));
if (right > mid)
MAX = max(MAX, query (nod2, mid + 1, hi, left, right));
return MAX;
}
void create (int node, int lo, int hi) {
if (lo == hi) {
arb[node] = v[lo];
return;
}
create (nod1, lo, mid);
create (nod2, mid + 1, hi);
arb[node] = max(arb[nod1], arb[nod2]);
}
int main() {
fin >> n >> m;
for (int x, i = 1; i <= n; ++i)
fin >> v[i];
create (1, 1, n);
for (int t, x, y, i = 0; i < m; ++i) {
fin >> t >> x >> y;
if (!t)
fout << query(1, 1, n, x, y) << "\n";
else
update (1, 1, n, x, y);
}
}