#include <fstream>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
const int N = 4e5 + 5;
int a[N], n, u, x, y;
bool type;
void update(int node, int lt, int rt, int poz, int val) {
if (lt == rt) {
a[node] = val;
return;
}
if (poz <= ((lt + rt) >> 1))
update((node << 1), lt, ((lt + rt) >> 1), poz, val);
else
update((node << 1) + 1, ((lt + rt) >> 1) + 1, rt, poz, val);
a[node] = max(a[node << 1], a[(node << 1) + 1]);
}
int query(int node, int lt, int rt, int lo, int hi) {
if (lo <= lt && rt <= hi)
return a[node];
if (lo > rt || hi < lt)
return 0;
int MAX = 0;
MAX = max(query((node << 1), lt, ((lt + rt) >> 1), lo, hi), query((node << 1) + 1, ((lt + rt) >> 1) + 1, rt, lo, hi));
return MAX;
}
int main() {
fin >> n >> u;
for (int i = 1; i <= n; ++i) {
fin >> x;
update(1, 1, n, i, x);
}
while (u--) {
fin >> type >> x >> y;
if (!type)
fout << query(1, 1, n, x, y) << "\n";
else
update(1, 1, n, x, y);
}
}