#include <bits/stdc++.h>
using namespace std;
ifstream fi("arbint.in");
ofstream fo("arbint.out");
const int N = 1e5 + 5, SQRT = 320;
int v[N], bucks[SQRT];
int n, q;
static int query(int st, int dr) {
int ant, buck_st, buck_dr;
ant = 0;
if (st / SQRT == dr / SQRT) {
for (int i = st; i <= dr; ++i)
ant = max(ant, v[i]);
return ant; }
buck_st = st / SQRT;
buck_dr = dr / SQRT;
for (int i = st; i / SQRT == buck_st; ++i)
ant = max(ant, v[i]);
for (int i = dr; i / SQRT == buck_dr; --i)
ant = max(ant, v[i]);
for (int i = buck_st + 1; i <= buck_dr - 1; ++i)
ant = max(ant, bucks[i]);
return ant; }
static void update(int pos, int val) {
int buck, s, e;
buck = pos / SQRT;
s = pos - pos % SQRT;
e = s + SQRT - 1;
v[pos] = val;
bucks[buck] = 0;
for (int i = s; i <= e; ++i)
bucks[buck] = max(bucks[buck], v[i]); }
int main() {
int op, l, r, pos, x;
fi >> n >> q;
for (int i = 0; i < n; ++i) {
fi >> v[i];
bucks[i / SQRT] = max(bucks[i / SQRT], v[i]); }
while (q--) {
fi >> op;
switch (op) {
case 0: { // query
fi >> l >> r;
fo << query(--l, --r) << '\n';
break; }
case 1: { // update
fi >> pos >> x;
update(--pos, x);
break; } } }
return 0; }