#include <cstdlib>
#include <cstdio>
#include <vector>
#include <cstring>
#include <string>
using namespace std;
#define NAME "arbint"
#define MAXN 100001
#define MAXM 100001
#define INF 0x3f3f3f3f
auto fin = fopen(NAME ".in", "r");
auto fout = fopen(NAME ".out", "w");
int n;
int m;
vector<int> v;
vector<int> arb;
// string spaces;
int max(int a, int b) {
return a >= b ? a : b;
}
int query(int node, int left, int right, int& qleft, int& qright) {
// spaces.append(" ");
// printf("%sq[%d-%d] val %d\n", spaces.c_str(), left, right, arb[node]);
if (qleft <= left && right <= qright)
// return spaces.pop_back(), arb[node];
return arb[node];
auto mij = (left + right) / 2;
int ret1 = -INF, ret2 = -INF;
if (qleft <= mij)
ret1 = query(2 * node + 1, left, mij, qleft, qright);
if (mij < qright)
ret2 = query(2 * node + 2, mij + 1, right, qleft, qright);
// spaces.pop_back();
return max(ret1, ret2);
}
int query(int left, int right) {
// printf("Query for [%d-%d]\n", left, right);
// spaces = "";
return query(0, 0, v.size() - 1, left, right);
}
int createarb(int node, int left, int right) {
if (left == right)
return arb[node] = v[left];
auto mij = (left + right) / 2;
auto lval = createarb(2 * node + 1, left, mij);
auto rval = createarb(2 * node + 2, mij + 1, right);
return arb[node] = max(lval, rval);
}
int createarb() {
return createarb(0, 0, v.size() - 1);
}
int update(int node, int left, int right, int& pos, int& val) {
// spaces.append(" ");
// printf("%su[%d-%d] val %d\n", spaces.c_str(), left, right, arb[node]);
if (left == right && left == pos)
return arb[node] = val;
auto mij = (left + right) / 2;
if (pos <= mij)
return arb[node] = max(arb[2 * node + 2],
update(2 * node + 1, left, mij, pos, val));
return arb[node] = max(arb[2 * node + 1],
update(2 * node + 2, mij + 1, right, pos, val));
}
int update(int pos, int val) {
// printf("Update for v[%d] = %d\n", pos, val);
// spaces = "";
return update(0, 0, v.size() - 1, pos, val);
}
int main() {
fscanf(fin, "%d %d", &n, &m);
v.resize(n);
for (auto i = 0; i < n; ++i)
fscanf(fin, "%d", &v[i]);
int npow2 = 1;
while (npow2 < 2 * n - 1)
npow2 <<= 1;
// printf("%d\n", npow2);
arb.resize(npow2);
memset(&arb[0], 0x3f, arb.size() * sizeof(int));
createarb(0, 0, n - 1);
int op, arg1, arg2;
for (auto i = 0; i < m; ++i) {
fscanf(fin, "%d %d %d", &op, &arg1, &arg2);
// printf("%d %d %d\n", op, arg1, arg2);
if (op == 0)
fprintf(fout, "%d\n", query(arg1 - 1, arg2 - 1));
// printf("%d\n", query(arg1 - 1, arg2 - 1));
else
update(arg1 - 1 , arg2);
}
return 0;
}