#include <iostream>
#include <fstream>
using namespace std;
template <class T>
class Aint {
public:
Aint(const int size, T (* f)(T, T)) : size(size), f(f) {
array = new T [size * 3];
}
~Aint() {
delete[] array;
}
T query(const int l, const int r) {
li = l;
ri = r;
return query(1, 1, size);
}
void update(const int p, const T v) {
this->p = p;
value = v;
update(1, 1, size);
}
private:
T query(const int n, const int l, const int r) {
if (li <= l && r <= ri) {
return array[n];
}
const int m = (l + r) / 2;
if (li > m) {
return query(2 * n + 1, m + 1, r);
}
if (ri <= m) {
return query(2 * n, l, m);
}
return f(query(2 * n, l, m), query(2 * n + 1, m + 1, r));
}
void update(int n, int l, int r) {
if (p < l || p > r) {
return;
}
if (l == r) {
array[n] = value;
return;
}
const int m = (l + r) / 2;
update(n * 2, l, m);
update(n * 2 + 1, m + 1, r);
array[n] = f(array[n * 2], array[n * 2 + 1]);
}
int li, ri, p;
const int size;
T *array, value;
T (* f)(T, T);
};
static int max(int x, int y) {
return x > y ? x : y;
}
int n, m;
ifstream F("arbint.in");
ofstream G("arbint.out");
int main() {
F >> n >> m;
Aint<int> *aint = new Aint<int>(n, &max);
for (int i = 1, x; i <= n; ++i) {
F >> x;
aint->update(i, x);
}
for (int i = 1, t, x, y; i <= m; ++i) {
F >> t >> x >> y;
if (t) {
aint->update(x, y);
} else {
G << aint->query(x, y) << '\n';
}
}
delete aint;
}