#include <fstream>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
const int N = 1e5;
int arb[N*3], n, m;
void update (int node, int lo, int hi, int poz, int x) {
if (lo == hi) {
arb[node] = x;
return;
}
int mid = (lo + hi) >> 1;
if (poz <= mid)
update (node * 2, lo, mid, poz, x);
else
update (node * 2 + 1, mid + 1, hi, poz, x);
arb[node] = max(arb[node*2], arb[node*2+1]);
}
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 mid = (lo + hi) >> 1, MAX = -2e9;
if (left <= mid)
MAX = max(MAX, query (node * 2, lo, mid, left, right));
if (right > mid)
MAX = max(MAX, query (node * 2 + 1, mid + 1, hi, left, right));
return MAX;
}
int main() {
fin >> n >> m;
for (int x, i = 1; i <= n; ++i) {
fin >> x;
update (1, 1, n, i, x);
}
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);
}
}