#include <bits/stdc++.h>
#define L 100005
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, q;
int aint[4 * L], mx;
void update(int node, int le, int ri, int pos, int val) {
if (le == ri) {
aint[node] = val;
return;
}
int mid = (le + ri) / 2;
if (pos <= mid)
update(2 * node, le, mid, pos, val);
else
update(2 * node + 1, mid + 1, ri, pos, val);
aint[node] = max(aint[2 * node], aint[2 * node + 1]);
}
void query(int node, int le, int ri, int x, int y) {
if (x <= le && ri <= y) {
mx = max(mx, aint[node]);
return;
}
int mid = (le + ri) / 2;
if (x <= mid)
query(2 * node, le, mid, x, y);
if (mid < y)
query(2 * node + 1, mid + 1, ri, x, y);
}
int main() {
fin >> n >> q;
for (int i = 1; i <= n; i++) {
int x;
fin >> x;
update(1, 1, n, i, x);
}
for (int i = 1; i <= q; i++) {
int t, a, b;
fin >> t >> a >> b;
if (t == 0) {
mx = 0;
query(1, 1, n, a, b);
fout << mx << "\n";
}
else
update(1, 1, n, a, b);
}
return 0;
}