#include <iostream>
#include <fstream>
#define NMAX 100000
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int aint[NMAX * 4 + 1], v[NMAX + 1];
int join(int a, int b) {
return a < b ? b : a;
}
void build(int poznode, int l, int r) {
if (l == r) {
aint[poznode] = v[l];
return;
}
int mid = (l + r) / 2;
build(poznode * 2, l, mid);
build(poznode * 2 + 1, mid + 1, r);
aint[poznode] = join(aint[poznode * 2], aint[poznode * 2 + 1]);
}
void update(int poznode, int l, int r, int poz, int val) { /// elementul de pe pozitia poz ia valoarea val
if (l == r) {
aint[poznode] = val;
return;
}
int mid = (l + r) / 2;
if (poz <= mid)
update(poznode * 2, l, mid, poz, val);
else
update(poznode * 2 + 1, mid + 1, r, poz, val);
aint[poznode] = join(aint[poznode * 2], aint[poznode * 2 + 1]);
}
int query(int poznode, int l, int r, int a, int b) {
int val;
if (l >= a && r <= b)
return aint[poznode];
int mid = (l + r) / 2;
if (a <= mid)
val = query(poznode * 2, l, mid, a, b);
if (b >= mid + 1 && a <= mid)
val = join(val, query(poznode * 2 + 1, mid + 1, r, a, b));
else if (b >= mid + 1)
val = query(poznode * 2 + 1, mid + 1, r, a, b);
return val;
}
int main() {
int n, q, i, op, a, b, poz, val;
fin >> n >> q;
for (i = 1; i <= n; i++)
fin >> v[i];
build(1, 1, n);
while (q--) {
fin >> op;
if (op == 0) {
fin >> a >> b;
fout << query(1, 1, n, a, b) << "\n";
}
else {
fin >> poz >> val;
update(1, 1, n, poz, val);
//cout << aint[5] << "\n";
}
}
return 0;
}