#include <fstream>
#define NMAX 90
using namespace std;
ifstream cin ("arbint.in");
ofstream cout ("arbint.out");
int aint[4 * NMAX + 1], v[NMAX + 1];
int join(int a, int b) {
return a > b ? a : b;
}
void build_aint(int node, int st, int dr) {
if (st == dr) {
aint[node] = v[st];
return;
}
int mid = (st + dr) / 2;
build_aint(node * 2, st, mid);
build_aint(node * 2 + 1, mid + 1, dr);
aint[node] = join(aint[node * 2], aint[node * 2 + 1]);
}
void update(int node, int st, int dr, int poz, int val) {
if (st == dr) { /// daca am ajuns pe pozitia poz
aint[node] = val;
return;
}
int mid = (st + dr) / 2;
if (poz <= mid)
update(node * 2, 1, mid, poz, val);
else
update(node * 2 + 1, mid + 1, dr, poz, val);
aint[node] = join(aint[node * 2], aint[node * 2 + 1]);
}
int query(int node, int st, int dr, int lfind, int rfind) {
if (lfind <= st && rfind >= dr)
return aint[node];
int sol = 0;
int mid = (st + dr) / 2;
if (lfind <= mid)
sol = join(sol, query(node * 2, 1, mid, lfind, rfind));
if (rfind > mid)
sol = join(sol, query(node * 2 + 1, mid + 1, dr, lfind, rfind));
return sol;
}
int main() {
int n, m, i, op, a, b;
cin >> n >> m;
for (i = 1; i <= n; i++)
cin >> v[i];
build_aint(1, 1, n);
while (m--) {
cin >> op >> a >> b;
if (op == 0)
cout << query(1, 1, n, a, b) << "\n";
else
update(1, 1, n, a, b);
}
return 0;
}